前言
iOS 11
版本由于對于Nav
層級結(jié)構(gòu)的改變,導致以前的方法無法達到理想的移動效果,使頂部的按鈕完全靠左,或者是靠右.
該修改思路目前對于iOS 11.2
的系統(tǒng)部分情況已經(jīng)無效.
原因是由于從上一個vc返回到當前vc的時候,可能不會觸發(fā)當前vc的viewDidLayoutSubviews
方法,就算觸發(fā)了此時self.navigationController.navigationBar
也是空的,導致取不到需要修改約束的view
,所以造成了約束無法修改為0
,達不到現(xiàn)有效果.
臨時修改方法
直接寫一個UINavigationBar
的分類,在分類中重寫了layoutSubviews
方法.
重寫了之后應該就將原有添加約束的代碼覆蓋掉了,所以邊距不設置也為0了.不過這樣的話,內(nèi)部所有的布局都需要自己完成.
- (void)layoutSubviews{
for (UIView *subview in self.subviews) {
if ([NSStringFromClass(subview.class) containsString:@"UIBarBackground"]) {
if (subview.subviews.count>2) {
return;
}
UIImageView * img=[[UIImageView alloc]initWithFrame:CGRectMake(0, -20, ScreenWidth, 64)];
img.image=[UIImage imageNamed:@"nav_bg"];
[subview addSubview:img];
}
}
}
修改思路
在iOS11
之前保持原有方式進行設置,iOS11
之后進行額外的邊距約束修改達到移動效果.
從viewDebug
的界面上觀察可以看到需要將UIButtonBarStackView
距離左邊和右邊的16
的約束改為0
即可.
核心代碼
配置導航器view
代碼
//0:leftBarButtonItems,1:rightBarButtonItems
- (void)initBarItem:(UIView*)view withType:(int)type{
UIBarButtonItem * buttonItem = [[UIBarButtonItem alloc]initWithCustomView:view];
//解決按鈕不靠左 靠右的問題.iOS 11系統(tǒng)需要單獨處理
UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceItem.width = -16;//這個值可以根據(jù)自己需要自己調(diào)整
switch (type) {
case 0:
if (!IS_IOS_VERSION_11) {
self.navigationItem.leftBarButtonItems =@[spaceItem,buttonItem];
}else{
self.navigationItem.leftBarButtonItems =@[buttonItem];
}
break;
case 1:
if (!IS_IOS_VERSION_11) {
self.navigationItem.rightBarButtonItems =@[spaceItem,buttonItem];
}else{
self.navigationItem.rightBarButtonItems =@[buttonItem];
}
break;
default:
break;
}
}
處理iOS11
情況下的偏移問題,將邊距為16
的約束的值改為0
.
-(void)viewDidLayoutSubviews{
if (!IS_IOS_VERSION_11) return;
UINavigationItem * item=self.navigationItem;
NSArray * array=item.leftBarButtonItems;
if (array&&array.count!=0){
//這里需要注意,你設置的第一個leftBarButtonItem的customeView不能是空的,也就是不要設置UIBarButtonSystemItemFixedSpace這種風格的item
UIBarButtonItem * buttonItem=array[0];
UIView * view =[[[buttonItem.customView superview] superview] superview];
NSArray * arrayConstraint=view.constraints;
for (NSLayoutConstraint * constant in arrayConstraint) {
//在plus上這個值為20
if (fabs(constant.constant)==16) {
constant.constant=0;
}
}
}
}
Demo地址:https://github.com/StoneMover/alldemo/tree/master/navDemo