如下圖1所示,正常的在一個UINavigationController中,self.navigationItem.leftBarButtonItem 和self.navigationItem.rightBarButtonItem默認(rèn)都是距離兩邊都有一定距離的,而且navigationItem是繼承于NSObject,我們不能設(shè)置leftItem、rightItem、以及titleView的frame。但是經(jīng)常會有需求導(dǎo)航欄navigationBar上titleView和rightItem都是緊挨著屏幕兩邊或者是間距很小,用iOS默認(rèn)的設(shè)置往往都達(dá)不到想要的效果。根據(jù)我的實踐經(jīng)驗,有兩種方式可以實現(xiàn)以上的需求。下面我簡單說一下思路
系統(tǒng)默認(rèn)的leftItem、rightItem、和titleView布局風(fēng)格就是如下圖一樣的,中間的titleView的寬度會取決于于leftItem和rightItem的寬度,在這里我先 假設(shè)leftItem距離屏幕最左邊的距離和rightItem距離屏幕最右邊的距離都是space=20。原則就是:會先確保leftItem 和rightItem的布局完的情況下再布局titleView,而titleView的布局時會優(yōu)先考慮參照屏幕居中對齊,當(dāng)這個居中對齊布局放的下時,不會重疊到leftItem 和rightItem時,就是我們想要的title居中顯示的效果。當(dāng) titleView 的居中布局放不下,但是titleView的寬度是放的下時。有兩種情況:1、(titleView距離leftItem的距離小于 (titleView的寬度/2))這種情況下titleView會與leftItem保持最小距離布局,導(dǎo)航欄的title不是居中顯示的,會往右邊偏移2、(titleView距離rightItem的距離小于 (titleView的寬度/2))這種情況下titleView會與rightItem保持最小距離布局導(dǎo)航欄的title不是居中顯示的,會往左偏移
**當(dāng)titleView的寬度遠(yuǎn)大于中間的空隙,titleView的寬度放不下時,titleView也會像下圖居中顯示,與rightItem和leftItem都保持最小間距

為了實現(xiàn)我們想要的 leftItem和rightItem 都距離屏幕邊框很近,然后title居中顯示的效果。有兩種方式:
第一種方式:就是我自定義 leftItem、rightItem 的時候(initWithCustomView),都在自定義的view上面 add一個子view 讓這個子view來控制 與屏幕的間距。


特別提示:leftItem點擊區(qū)域太大的解決辦法:我們用一個自定義設(shè)置titleView。self.navigationItem.titleView = label;然后給titleview也加上相應(yīng)的手勢點擊就可以控制leftItem的點擊區(qū)域不會往右邊中間靠。

第二種方式:就是我設(shè)置BarButtonItem的時候 其實是用的setBarButtonItems方法。給它插入透明的一個item,然后去設(shè)置一個偏移距離。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。整體設(shè)置navigationBar上字體和圖案的顏色,性質(zhì)跟tabbar一樣的,設(shè)置成一個顏色,就不會管圖片的顏色。當(dāng)然用的initWithCustomView這個方法除外(這個是自定義navigationItem)
[self.navigationController.navigationBarsetBarTintColor:[UIColorwhiteColor]];//整體設(shè)置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];
}
}
第一次嘗試寫文章,有許多不足之處請多多指點。