适配iOS 11和iPhone X

一、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;
适配iOS 11和iPhone X_第1张图片
未设置.png

适配iOS 11和iPhone X_第2张图片
已设置.png

其次还有个属性largeTitleDisplayMode,可以控制大标题是否显示,其值有Automatic(默认值)和NeverAutomatic根据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;
适配iOS 11和iPhone X_第3张图片
添加搜索栏.png

添加搜索栏后还可以设置该搜索栏是否根据滑动隐藏

/* 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是一个枚举类型,值有以下几种:
automaticscrollableAxes一样,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

改变默认内嵌位置

7.语法警告自动纠错功能

你可能感兴趣的:(适配iOS 11和iPhone X)