自定义导航栏titleView在iOS10以上的问题

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

iOS11之前的导航栏视图结构


**titleView导航栏在iOS11及之后的视图结构层**
 

iOS11之前的导航栏视图结构
iOS11之后的导航栏视图结构

对比两者明显发现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怎么办?还能肿么办
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值