先看兩張圖:
titleView導(dǎo)航欄在iOS11之前的系統(tǒng)的視圖結(jié)構(gòu)層
20190220100727.png
titleView導(dǎo)航欄在iOS11及之后的視圖結(jié)構(gòu)層
20190220100049.png
對(duì)比兩者明顯發(fā)現(xiàn)titleView在導(dǎo)航欄上的層級(jí)不同,iOS11之前直接是添加在UINavigationBar,在iOS11之后則多了個(gè)UINavigationBarContentView,titleView添加在這個(gè)上面了。
導(dǎo)致的問題:
在iOS11之前設(shè)置titleView的frame后,賦值即可
self.navigationItem.titleView = navTitleView;
但是在iOS11之后你會(huì)發(fā)現(xiàn)布局完全和預(yù)期不同,經(jīng)過查看視圖層級(jí),發(fā)現(xiàn)在iOS11上titleView報(bào)約束錯(cuò)誤,這也就是布局達(dá)不到預(yù)期的原因。
第一種解決辦法:
self.navigationItem.titleView = navTitleView;
if (@available(iOS 11.0, *)) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[navTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.bottom.right.mas_equalTo(0);
}];
});
}
如果不延遲0.1s,直接約束會(huì)找不到父視圖。
第二種方法:
在自定義的titleView里重新intrinsicContentSize方法
OC:
- (CGSize)intrinsicContentSize {
return UILayoutFittingExpandedSize;
}
Swift:
override var intrinsicContentSize: CGSize {
return UIView.layoutFittingExpandedSize
}
有的問了,沒自定義titleView怎么辦?還能腫么辦