前言
最近iOS11 發放出來已經有一段時間了,不得不說每到9月,都是果粉興奮,iOS代碼狗抓狂的時候。。。。
iOS 11 放出來,于是各種各樣的坑也就跟預留好了。。。
其中一個比較煩人的坑就是導航欄UIBarButtonItem自定義按鈕偏移 在iOS11 系統下 通過以前的UIBarButtonSystemItemFixedSpace的方式已經無法修復了。。。。。
所以我們也是嘗試了各種方法去填iOS11給我們挖的坑。。。
iOS11 和iOS11效果圖如下:(響應范圍可以自己親測調試)
目前網上比較流行的方法
方法一:iOS11 導航欄按鈕位置問題的解決
作者:spicyShrimp
http://blog.csdn.net/spicyShrimp/article/details/77891717
附上地址,大家可以去看一下,利用各種黑魔法解決了這個bug,不論是修復點擊范圍,還是視圖布局都做到了完美解決,但問題就是這個方案的代價比較大。
方法一:iOS11導航欄自定義按鈕偏移問題
作者:可可西里的藏野驢
http://blog.csdn.net/guo4114/article/details/78053025
這個方法只是解決了視圖問題,但還有一個實質問題尚未解決,就是返回按鍵的點擊位置依舊沒有改變,大家可以試一試。
我的方法
具體思路是: 先修改button 的視圖布局,再修改button 的響應范圍。
第一步:適配系統,iOS11 系統以下,依舊保持不變
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
[backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
[backButton addClickEventWithBlock:clickHandler];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//配置返回按鈕距離屏幕邊緣的距離
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceItem.width = -10.0f;
self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];
第二步:iOS11 系統下,修改UI布局
依舊在上面的代碼進行系統區分,修改布局
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
[backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
[backButton addClickEventWithBlock:clickHandler];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//配置返回按鈕距離屏幕邊緣的距離
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceItem.width = -10.0f;
// iOS 11 系統,將Button的內容 和 圖片根具體需求進行便處理
if (([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0)) {
backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
}
self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];
第三步:修改布局之后,修改UIBarButtonItem 的響應范圍。
backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
只是修改了 返回Button 的視圖,沒有對返回Button的實際響應范圍進行修改。所以下面的實際修改范圍 需要加入這個一段代碼,來修改button的響應范圍。
// 修改返回**Button**的響應范圍 ,往左邊擴大6 個膽怯
backButton.hitEdgeInsets =UIEdgeInsetsMake(0, -6, 0, 0);
WHAT?? hitEdgeInsets button 有這個東西嗎???
確實沒有。這個只是我們給UIButton利用分類Category,添加的一個屬性,來修改button 的響應范圍。
具體代碼和方式參考:
UIButton 擴大按鈕的響應區域(runtime)
最終代碼:
由于修改的東西不多,我這里就把代碼貼出來就好了:
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"注冊";
kDefineWeakSelf;
[self showCustomLeftImgBarButton:^(UIButton *button) {
[weakSelf.navigationController popViewControllerAnimated:YES];
}];
// Do any additional setup after loading the view.
}
-(void)showCustomLeftImgBarButton:(void (^)(UIButton *button))clickHandler{
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
[backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
[backButton addClickEventWithBlock:clickHandler];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//配置返回按鈕距離屏幕邊緣的距離
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceItem.width = kIOS11_OR_LATER? 0:fixSpacing;
if (kIOS11_OR_LATER) {
backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
backButton.hitEdgeInsets =UIEdgeInsetsMake(0, -6, 0, 0);
}
self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];
}
給UIButton利用分類Category,添加的一個屬性,來修改button 的響應范圍。
具體代碼和方式參考:
UIButton 擴大按鈕的響應區域(runtime)