前言
iOS 11版本由于對于Nav層級結構的改變,導致以前的方法無法達到理想的移動效果,使頂部的按鈕完全靠左,或者是靠右.
修改思路
在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系統需要單獨處理 UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; spaceItem.width = -16;//這個值可以根據自己需要自己調整 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) { if (fabs(constant.constant)==16) { constant.constant=0; } } }}
改后效果.png
Demo地址:https://github.com/StoneMover/navDemo.git
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答