自定义navigationItem控制它与屏幕的间距

如下图1所示,正常的在一个UINavigationController中,self.navigationItem.leftBarButtonItem 和self.navigationItem.rightBarButtonItem默认都是距离两边都有一定距离的,而且navigationItem是继承于NSObject,我们不能设置leftItem、rightItem、以及titleView的frame。但是经常会有需求导航栏navigationBar上titleView和rightItem都是紧挨着屏幕两边或者是间距很小,用iOS默认的设置往往都达不到想要的效果。根据我的实践经验,有两种方式可以实现以上的需求。下面我简单说一下思路

系统默认的leftItem、rightItem、和titleView布局风格就是如下图一样的,中间的titleView的宽度会取决于于leftItem和rightItem的宽度,在这里我先 假设leftItem距离屏幕最左边的距离和rightItem距离屏幕最右边的距离都是space=20。原则就是:会先确保leftItem 和rightItem的布局完的情况下再布局titleView,而titleView的布局时会优先考虑参照屏幕居中对齐,当这个居中对齐布局放的下时,不会重叠到leftItem 和rightItem时,就是我们想要的title居中显示的效果。当 titleView 的居中布局放不下,但是titleView的宽度是放的下时。有两种情况:1、(titleView距离leftItem的距离小于 (titleView的宽度/2))这种情况下titleView会与leftItem保持最小距离布局,导航栏的title不是居中显示的,会往右边偏移2、(titleView距离rightItem的距离小于 (titleView的宽度/2))这种情况下titleView会与rightItem保持最小距离布局导航栏的title不是居中显示的,会往左偏移

**当titleView的宽度远大于中间的空隙,titleView的宽度放不下时,titleView也会像下图居中显示,与rightItem和leftItem都保持最小间距

图1默认的leftItem、rightItem、和titleView布局


为了实现我们想要的 leftItem和rightItem 都距离屏幕边框很近,然后title居中显示的效果。有两种方式:

第一种方式:就是我自定义 leftItem、rightItem 的时候(initWithCustomView),都在自定义的view上面 add一个子view 让这个子view来控制 与屏幕的间距。


图2


中间titleview就是一个label,这样它就不会超出范围 重叠到 rightItem 保存的位置。

特别提示:leftItem点击区域太大的解决办法:我们用一个自定义设置titleView。self.navigationItem.titleView = label;然后给titleview也加上相应的手势点击就可以控制leftItem的点击区域不会往右边中间靠。


中间titleview 是一个view add一个label组成,结果label的宽度 是会按真实的尺寸显示,会超出 view的宽度而挤到右边保存的位置


第二种方式:就是我设置BarButtonItem的时候 其实是用的setBarButtonItems方法。给它插入透明的一个item,然后去设置一个偏移距离。UIBarButtonSystemItemFixedSpacenegativeSeperator.width= -20;

UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(0,0,30,30)];

view.backgroundColor= [UIColorredColor];

UIBarButtonItem*leftButton = [[UIBarButtonItemalloc]initWithCustomView:view];

UIBarButtonItem*rightButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemActiontarget:selfaction:@selector(rightItemClick:)];

[self.navigationItem setLeftBarButtonItem:leftButton ];//这个方法是在category里面重写了的

[self.navigationItem setRightBarButtonItem:rightButton];//这个方法是在category里面重写了的

[self.navigationController.navigationBar setTintColor: [UIColororangeColor]];//如果不是自定义的navigationItem。整体设置navigationBar上字体和图案的颜色,性质跟tabbar一样的,设置成一个颜色,就不会管图片的颜色。当然用的initWithCustomView这个方法除外(这个是自定义navigationItem)

[self.navigationController.navigationBarsetBarTintColor:[UIColorwhiteColor]];//整体设置navigationBar的背景色


用第二种方式实现的效果

在 UINavigationItem+Margin.m 里面会有下面两个方法:

- (void)setLeftBarButtonItem:(UIBarButtonItem*)_leftBarButtonItem

{

if([[[UIDevicecurrentDevice]systemVersion]floatValue] >=7.0)

{

UIBarButtonItem*negativeSeperator = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];

negativeSeperator.width= -20;

if(_leftBarButtonItem)

{

[selfsetLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];

}

else

{

[selfsetLeftBarButtonItems:@[negativeSeperator]];

}

}

else

{

[selfsetLeftBarButtonItem:_leftBarButtonItemanimated:NO];

}

}

- (void)setRightBarButtonItem:(UIBarButtonItem*)_rightBarButtonItem

{

if([[[UIDevicecurrentDevice]systemVersion]floatValue] >=7.0)

{

UIBarButtonItem*negativeSeperator = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];

negativeSeperator.width= -20;

if(_rightBarButtonItem)

{

[selfsetRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];

}

else

{

[selfsetRightBarButtonItems:@[negativeSeperator]];

}

}

else

{

[selfsetRightBarButtonItem:_rightBarButtonItemanimated:NO];

}

}

第一次尝试写文章,有许多不足之处请多多指点。

推荐阅读更多精彩内容