- UIBarButtonItem 和 UINavigationItem
UIBarButtonItem是设置在导航栏左右两端的item,
rightBarButtonItem和leftBarButtonItem就是这个类型
UINavigationItem是用来管理rightBarButtonItem和leftBarButtonItem的,
rightBarButtonItem和leftBarButtonItem都是NavigationItem的一个属性
每个页面都应该用自己的UINavigationItem来管理BarButtonItem
每个页面的barButtonItem都不一样,所以设置时应该用代码
self.navigationItem.rightBarButtonItem (self表示当前控制器)
或者self.navigationItem.leftBarButtonItem
不要使用self.navigationController.navigationItem.rightBarButtonItem
-
UINavigationBar 导航栏的一些属性
2.1 tintColory用来设置导航栏上BarButtonItem的颜色的,
如果BarButtonItem 是用以下两种方法创建的,则title和Image的颜色都是TintColor设置的颜色
- (instancetype)initWithImage:(UIImage *)image
style:(UIBarButtonItemStyle)style
target:(id)target
action:(SEL)action
- (instancetype)initWithTitle:(NSString *)title
style:(UIBarButtonItemStyle)style
target:(id)target
action:(SEL)action
注意: 如果想要图片为真实图片的颜色, 生成图片时也可以用此方法
[[UIImage imageNamed:@"icon_"] imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)]
如果是用 - (instancetype)initWithCustomView:(UIView *)customView 创建, 则颜色只跟customView自己的颜色有关
3.2 translucent属性用来设置导航栏是否有穿透效果, 默认为YES
当translucent设置为YES时, 如果要修改导航栏的颜色,
则用self.navigationBar.barTintColor = [UIColor orangeColor]; (注意self是导航控制器)
但是在translucent为YES时, 设置的背景颜色渲染时会有色差
如果想要导航栏背景颜色没有色差,可将translucent设置为NO
translucent还有一个功能就是在有导航栏的页面,
translucent为NO时,
滚动视图的原点是以导航栏底部为起点,而且通过
self.automaticallyAdjustsScrollViewInsets = NO
或者
if (@available(iOS 11, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}设置也不会改变原点的位置
self.navigationController.navigationBar.translucent = NO;
/*
下面两个方法的作用:
1. 在没有导航栏且是滚动视图的页面,可以使滚动视图的顶部和状态栏重合
2. 在有导航栏且为滚动视图的页面, 可以使滚动视图的原点为屏幕的原点,而不是导航栏底部为原点
注意: 如果导航栏的translucent为NO时, 作用2会无效
*/
self.automaticallyAdjustsScrollViewInsets = YES;
if (@available(iOS 11, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
-
关于appearance方法最好不要用在导航栏上,否则会影响一下系统的控制器的显示,比如选择图片的控制器,通讯录控制器等
-
关于iPhone X, 顶部刘海在有导航栏时会跟导航栏的背景颜色一样
网友评论