在iOS 11系统上,UINavigation 添加 searchBar,导致UINavigationBar高度异常。
在iOS 11系统上,UINavigation 添加了searchBar之后,UINavigationBar的高度变成了56;在iOS 11系统以下,高度是44。
iOS 11系统UINavigation结构发生了改变。。 iOS11以前是直接把按钮加到了UINavigationBar上面,而iOS11则是先将按钮加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView、_UINavigationBarContentView,接着才是UINavigationBar。因此如果需要获取导航栏按钮 frame 或者 superView,这里需要专门做下适配
如图所示:
由于这个原因就导致填了到UINavigation 上的
titleView 、rightBarButtonItem、leftBarButtonItem
位置异常,titleView高度相应的变大,高度变成了36, iOS 11以前高度为28。 barButtonItem
位置偏上。如下图:
如果UINavigation 没有添加UISearchBar/UISearchController,这个问题不会出现,我猜测是iOS 11添加了UISearchController原因导致
解决方法:
1、网上搜索Stack Overflow 上直接更改searchBar的高度,
if (@available(iOS 11.0, *)) {
[[searchBar.heightAnchor constraintEqualToConstant:44.0] setActive:YES];
}
这样强制更改高度,所有rightBarButtonItem、leftBarButtonItem
位置都正常了,但是searchBar
的高度还是36,而整个UINavigationBar 的高度是44,所以SearchBar显得有点点大,还不知道怎么解决。效果如图:
注意:这里Active要设置成YES,不然只生效一次
2、我的方法:不更改UINavigationBar
高度,调整rightBarButtonItem、leftBarButtonItem
的位置偏移量。
// 更改图片的偏移量
if (@available(iOS 11, *)) {
_scanButton.imageInsets = UIEdgeInsetsMake(6, 0, 0, 0);
}
这样rightBarButtonItem、leftBarButtonItem
以及searchBar
位置看着都正常了,但是出现这么一个问题,当你切换到别的VC的时候,别的VC的UINavigationBar高度是44,就会出现一点上移闪屏问题,所以我还是采取了第一种方法。