自定義navigationItem控制它與屏幕的間距

如下圖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都保持最小間距

圖1默認(rèn)的leftItem、rightItem、和titleView布局


為了實現(xiàn)我們想要的 leftItem和rightItem 都距離屏幕邊框很近,然后title居中顯示的效果。有兩種方式:

第一種方式:就是我自定義 leftItem、rightItem 的時候(initWithCustomView),都在自定義的view上面 add一個子view 讓這個子view來控制 與屏幕的間距。


圖2


中間titleview就是一個label,這樣它就不會超出范圍 重疊到 rightItem 保存的位置。

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


中間titleview 是一個view add一個label組成,結(jié)果label的寬度 是會按真實的尺寸顯示,會超出 view的寬度而擠到右邊保存的位置


第二種方式:就是我設(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的背景色


用第二種方式實現(xiàn)的效果

在 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];

}

}

第一次嘗試寫文章,有許多不足之處請多多指點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容