iOS11后,系統(tǒng)更改了UINavigationBar的布局結(jié)構(gòu),所以會導(dǎo)致自定義導(dǎo)航按鈕的位置會便的很離譜?,F(xiàn)在推薦一個(gè)簡單方法:
有兩種方法:
1、如果是全局通用,則使用擴(kuò)展,
@implementation UINavigationBar (BDFixSpace)
+(void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method originalMethodImp = class_getInstanceMethod(self, @selector(layoutSubviews));
Method destMethodImp = class_getInstanceMethod(self, @selector(bd_layoutSubviews));
method_exchangeImplementations(originalMethodImp, destMethodImp);
});
}
-(void)bd_layoutSubviews{
[self bd_layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) containsString:@"_UINavigationBarContentView"]) {
UIEdgeInsets margins = subview.layoutMargins;
if(CURRENT_VERSION >= 11.0){
subview.frame = CGRectMake(-margins.left*0.5, -margins.top, margins.left*0.5 + margins.right*0.5 + subview.frame.size.width, margins.top + margins.bottom + subview.frame.size.height);
}else{
margins = UIEdgeInsetsZero;
}
break;
}
}
}
2、如果是自定義navigationbar,則重寫layoutsubview方法即可
-(void)layoutSubviews{
[self layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) containsString:@"_UINavigationBarContentView"]) {
UIEdgeInsets margins = subview.layoutMargins;
if(CURRENT_VERSION >= 11.0){
subview.frame = CGRectMake(-margins.left*0.5, -margins.top, margins.left*0.5 + margins.right*0.5 + subview.frame.size.width, margins.top + margins.bottom + subview.frame.size.height);
}else{
margins = UIEdgeInsetsZero;
}
break;
}
}
}
是不是很簡單!
謝謝,如果幫到你還請點(diǎn)個(gè)贊哈!