关于iOS 11的一些新特性适配实践总结

2020-01-21 02:15:03王旭

如果手动对 directionalLayoutMargins 赋值,那么在 viewRespectsSystemMinimumLayoutMargins 开启的情况下,系统会比较赋值后的 directionalLayoutMargins 和 systemMinimumLayoutMargins ,并取其较大值作为最终的 margins。


print("systemMinimumLayoutMargins :" + "(self.systemMinimumLayoutMargins)")
print("origin directionalLayoutMargins: " + "(self.view.directionalLayoutMargins)")

// 这里把 leading 和 trailing 分别赋值为相对于 systemMinimumLayoutMargins 的较大值20和较小值10
self.view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)
print("assigned directionalLayoutMargins: " + "(self.view.directionalLayoutMargins)")

// 打印日志可见只有 leading 的值改变为手动赋的值,trailing 依然遵循于 systemMinimumLayoutMargins
systemMinimumLayoutMargins :NSDirectionalEdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0)
origin directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 16.0, bottom: 34.0, trailing: 16.0)
assigned directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 20.0, bottom: 34.0, trailing: 16.0)

注意

如果不希望受到systemMinimumLayoutMargins的影响,那么把 view controller 的viewRespectsSystemMinimumLayoutMargins设为false即可.

Navigation bar

进入了 iOS 11,苹果为提供了更为漂亮和醒目的大标题的样式,如果想开启这样的功能,其实很简单。
只需要将 navigation bar 中的 prefersLargeTitles 置为 true 即可,这样便自动有了来自 iOS 11 中的大标题的样式。


self.navigationController.navigationBar.prefersLargeTitles = true

这里可以注意到,prefersLargeTitles 是配置在的 navigation controller 中的 navigation bar 中的。也就是说该 navigation controller 容器中的所有的 view controller 在此配置之后,都会受到影响。所以如果你要在当前的 navigation controller 中推入一个新的 view controller 的话,那么该 view controller 也会是大标题。因此为了避免这个问题,UIKit 为 UINavigationItem 提供了 largeTitleDisplayMode 属性。

该属性默认为 UINavigationItem.LargeTitleDisplayMode.automatic, 即保持与前面已经显示过的 navigation item 一致的样式。 如果想在后来的一个 view controller 避免大标题样式那么可以这么配置:


self.navigationItem.largeTitleDisplayMode = .never

除了大标题以外,在 iOS 11 中,UIKit 还为 navigation item 提供了便于管理搜索的接口。
具体参考如下:


self.navigationItem.searchController = self.searchController
self.navigationItem.hidesSearchBarWhenScrolling = true

在配置好你的 search controller 之后便可以直接提供给 navigation item 的 searchController属性上,这样的便能够在导航栏看到一个漂亮的搜索框了。