從 iOS 11 開始,UINavigationBar 使用了自動布局,左右兩邊的按鈕到螢屏之間會有 16 或 20 的邊距,
為了避免點擊到間距的空白處沒有回應,通常做法是:定義一個 UINavigationBar 子類,重寫 layoutSubviews 方法,在此方法里遍歷 subviews 獲取 _UINavigationBarContentView,并將其 layoutMargins 設定為 UIEdgeInsetsZero,
- (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) containsString:@"_UINavigationBarContentView"]) { subview.layoutMargins = UIEdgeInsetsZero; break; } }}
然而,這種做法在 iOS 13 中會導致崩潰,崩潰資訊如下:
Client error attempting to change layout margins of a private view
試圖更改私有視圖的布局邊距時出現錯誤
解決方案:
使用設定 frame 的方式,讓 _UINavigationBarContentView 向兩邊伸展,從而抵消兩邊的邊距
- (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) containsString:@"_UINavigationBarContentView"]) { if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) { UIEdgeInsets margins = subview.layoutMargins; subview.frame = CGRectMake(-margins.left, -margins.top, margins.left + margins.right + subview.frame.size.width, margins.top + margins.bottom + subview.frame.size.height); } else { subview.layoutMargins = UIEdgeInsetsZero; } break; } }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/11409.html
標籤:iOS
