Client error attempting to change layout margins of a private view

從 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;
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章