自定义导航栏titleView在iOS11前后的问题

先看两张图:
titleView导航栏在iOS11之前的系统的视图结构层

20190220100727.png

titleView导航栏在iOS11及之后的视图结构层
20190220100049.png

对比两者明显发现titleView在导航栏上的层级不同,iOS11之前直接是添加在UINavigationBar,在iOS11之后则多了个UINavigationBarContentView,titleView添加在这个上面了。

导致的问题:

在iOS11之前设置titleView的frame后,赋值即可

self.navigationItem.titleView = navTitleView;

但是在iOS11之后你会发现布局完全和预期不同,经过查看视图层级,发现在iOS11上titleView报约束错误,这也就是布局达不到预期的原因。
第一种解决办法:

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,直接约束会找不到父视图。
第二种方法:
在自定义的titleView里重新intrinsicContentSize方法

OC:

- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize;
}

Swift:

override var intrinsicContentSize: CGSize {
    return UIView.layoutFittingExpandedSize
}

有的问了,没自定义titleView怎么办?还能肿么办

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容