适配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;
未设置.png

已设置.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;
添加搜索栏.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.语法警告自动纠错功能
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,583评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,669评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,684评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,682评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,533评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,396评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,814评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,458评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,745评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,789评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,565评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,410评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,828评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,050评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,342评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,793评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,010评论 2 337

推荐阅读更多精彩内容

  • 官方资源 WWDC 2017 Session 204: Updating Your App for iOS 11 ...
    独木舟的木阅读 625评论 0 4
  • iPhone 的 navagationbar 高度 为 88, [[UIApplication sharedApp...
    dingzhijie阅读 411评论 0 1
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,709评论 1 92
  • iOS 11正式发布了,下面整理了一些该版本下的特点还有如何进行兼容适配工作。 1. UIView变化 1.1. ...
    杰嗒嗒的阿杰阅读 11,168评论 14 46
  • ——和繁华落尽深眸《合欢树》 粉蕊迎朝霭,瑶枝映暮辉。 数滴痴恋泪,几唤浪儿回。 苦誓合欢应,愁杀彩练偎。 夕颜何...
    不惑而歌阅读 452评论 19 28