一、iOS 11新增API
关于iOS 11新增功能更详细的介绍可以观看WWDC2017
传送门
1.large navigation titles——导航栏大标题
导航栏标题文字可以变的更大,因为导航栏中加入了一个新的属性prefersLargeTitles
,默认值是NO,不显示导航条大标题。
/* When set to YES, the navigation bar will use a larger out-of-line
* title view when requested by the current navigation item.
* To specify when the large out-of-line title view appears,
* see UINavigationItem.largeTitleDisplayMode. Defaults to NO.*/
navigationBar.prefersLargeTitles = YES;
其次还有个属性largeTitleDisplayMode
,可以控制大标题是否显示,其值有Automatic
(默认值)和Never
,Automatic
根据prefersLargeTitles
的值自动识别是否显示,而Never
不管prefersLargeTitles
设置成什么值,都不显示大标题。
/* When UINavigationBar.prefersLargeTitles=YES, this property
* controls when the larger out-of-line title is displayed.
* If prefersLargeTitles=NO, this property has no effect.
* The default value is Automatic.*/
navigationItem.largeTitleDisplayMode = Automatic;
2.new search experience——导航条嵌入搜索栏
在navigationItem中结合了searchController,可以直接在导航栏内侧下添加一个搜索栏。
/* A view controller that will be shown inside of a navigation controller
* can assign a UISearchController to this property to
* display the search controller’s search bar
* in its containing navigation controller’s navigation bar.*/
UISearchController *search = [[UISearchController alloc] initWithSearchResultsController:self];
search.searchBar.placeholder = @"搜索";
self.navigationItem.searchController = search;
添加搜索栏后还可以设置该搜索栏是否根据滑动隐藏
/* If this property is true (the default),
* the searchController’s search bar will hide as the user scrolls
* in the top view controller’s scroll view. If false, the search bar
* will remain visible and pinned underneath the navigation bar.*/
self.navigationItem.hidesSearchBarWhenScrolling = YES;
//其默认值是YES,设置YES则搜索栏上滑自动隐藏、下滑自动显示,这都是系统配置好的。
3.layout margins——布局空间
这三种布局供各位读者了解,实际项目中应用不怎么大,所以不做详细说明了,稍微有用的就是第三个。
/* directionalLayoutMargins.leading is used on the left
* when the user interface direction is LTR and on the right for RTL.
* Vice versa for directionalLayoutMargins.trailing. */
UIView.directionalLayoutMargins
/* Minimum layoutMargins for the view determined
* by the view controller from context and hardware information.
* The view controller's view will respect these minimums unless
* viewRespectsSystemMinimumLayoutMargins
* (which defaults to YES) is set to NO.
*/
UIViewController.systemMinimumLayoutMargins
此属性包含系统为视图控制器的根视图所期望的最小布局边距。不要重写此属性。停止考虑系统的最小版图边缘的根视图,设置viewRespectsSystemMinimumLayoutMargins属性为false。这个属性不影响根视图的子视图相关联的边缘。
如果你的视图控制器的根视图的directionalLayoutMargins属性指定自定义值,根视图的实际利润率设置为自定义值或最小值定义该属性,两者的值都大。例如,如果一个系统的最小边距值为20个点,并且在视图上为相同的边距指定一个值10,则视图使用边距的值20。
/* Default YES.
* The return value of the view's layoutMargins and directionalLayoutMargins properties
* will have values no smaller than the
* systemMinimumLayoutMargins.
* Set to NO for full customizability of the view's layoutMargins.
*/
UIViewController.viewRespectsSystemMinimumLayoutMargins
//如果在控制器中,UIViewController就用self代替
当此属性的值为true,根视图的布局空间的保证是不小于在systemMinimumLayoutMargins属性值。此属性的默认值为真。
更改此属性为false能够影响视图只能获取directionalLayoutMargins属性的内边距。将该属性中的边距设置为0可以完全消除视图的边距。
4.safe area——安全区
/* Custom container UIViewController subclasses can
* use this property to add to the overlay
* that UIViewController calculates for the safeAreaInsets for
* contained view controllers.
*/
UIViewController.additionalSafeAreaInset
使用此属性来调整该视图控制器的视图指定数量的安全区的插图。安全区域定义了视图控制器的可见区域的部分,可以保证不受系统状态栏的影响。您可以使用此属性扩展安全区域,以便在接口中包含自定义内容。例如,一个绘图应用程序可以使用这个属性来避免内容显示在工具栏。
UIViewController.viewSafeAreaInsetsDidChange()
UIViewController.viewLayoutMarginsDidChange()
使用此方法更新您的接口以适应新的安全区域。UIKit更新安全区响应大小的变化对系统的酒吧或当你修改你的视图控制器的附加安全区的插图。UIKit也立即调用此方法之前,你的观点出现在屏幕上。
UIView.safeAreaInsets
UIView.safeAreaInsetsDidChange()
5.scrollView
/* When contentInsetAdjustmentBehavior allows,
*UIScrollView may incorporate its safeAreaInsets into the adjustedContentInset.
*/
UIScrollView.adjustedContentInset
iOS 11中的adjustedContentInset
代替了其他版本中的contentInset
,新增的contentInsetAdjustmentBehavior
属性需要用来配置adjustedContentInset
。
/* frameLayoutGuide anchors
* (e.g.,frameLayoutGuide.centerXAnchor) refer to the untransformed frame of the scroll view.
*/
UIScrollView.frameLayoutGuide
负责UIScrollView
在屏幕中的大小和位置。
/* contentLayoutGuide anchors (e.g., contentLayoutGuide.centerXAnchor, etc.) refer to
the untranslated content area of the scroll view.
*/
UIScrollView.contentLayoutGuide
负责设置UIScrollView
的内容位置大小或者让内容随着滚动而移动。
/* Configure the behavior of adjustedContentInset.
Default is UIScrollViewContentInsetAdjustmentAutomatic.
*/
UIScrollView.contentInsetAdjustmentBehavior
UIScrollViewContentInsetAdjustmentBehavior
是一个枚举类型,值有以下几种:
automatic
和scrollableAxes
一样,scrollView
会自动计算和适应顶部和底部的内边距并且在scrollView
不可滚动时,也会设置内边距。
scrollableAxes
自动计算内边距。
never
不计算内边距。
always
根据safeAreaInsets
计算内边。
6.tableView
// default is UITableViewAutomaticDimension, set to 0 to disable
UITableView.estimatedRowHeight
UITableView.estimatedSectionHeaderHeight
UITableView.estimatedSectionFooterHeight
如果代码中没有设置cell行高或者没有重写相应的代理方法,那么系统会自动给行、页眉和页脚设置一个估计值。
如果要适配各个iOS版本,最好在AppDelegate中添加:
if (@available(iOS 11.0, *)) {
UITableView.appearance.estimatedRowHeight = 0;
UITableView.appearance.estimatedSectionFooterHeight = 0;
UITableView.appearance.estimatedSectionHeaderHeight = 0;
}
//appearance设置所有的tableView的行、页眉和页脚估计值全部为0。
/* Changes how custom separatorInset values are interpreted.
* The default value is UITableViewSeparatorInsetFromCellEdges*/
UITableView.separatorInsetReference
改变默认内嵌位置