可可触摸(WWDC 2017 Session 201)TL; DR中的新增功能

以下是WWDC 2017(会议201)的大部分“可可接触新功能”会议的快速回顾。 这都是现场输入的内容,因此,如果某些内容不正确,请随时纠正我。

生产率

拖放

通过创建UIDragInteraction(UIInteraction的子类)并将其附加到您希望具有Draggable的视图(并分配其委托),来启用Drag。

委托人提供拖动项目的数据,允许自定义“提升”动画并自定义draggin预览。

通过创建UIDropInteraction并以类似方式设置其委托来启用Drop。 委托允许在拖动移动时更新UI,接收拖放上的常规数据并自定义拖放动画。

开箱即用地支持许多UIKit元素-TableView,CollectionView,TextView,TextField和WebView。

文件管理

引入了新的文件资源管理器,该文件资源管理器允许在我们的应用程序中进行演示。

UIDoumentBrowserViewController是我们可以在应用程序中显示的ViewController。 它是高度可定制的,并允许访问设备内容,iCloud内容和外部云服务。
协调文件访问至关重要,因为我们不能指望我们的应用程序是唯一可以触摸某些文件/资产的应用程序。 可以通过使用NSFileCoordinator / UIDocument来完成。

用户界面优化

大标题导航栏可以具有内置的搜索栏,但是当您向上滚动内容时,搜索栏将随着大标题折叠为常规小标题而折叠,就像我们习惯于iOS 10。

在大多数情况下,这几乎可以自动完成,因为系统可以通过将UINavigationBar.prefersLargeTitle设置为true来自动处理它。

您还可以使用UINavigationItem.largeTitleDisplayMode来围绕导航级别以更精细的方式控制大标题显示模式。

通过设置UINavigationBar.searchBarController启用统一搜索栏。

通常,导航控制器/堆栈中的顶部控制器将是唯一使用“大型”样式标题的控制器,而内部控制器应使用标准的小变化。

导航栏中有一个内置的Pull-to-refresh,看起来很棒。

我们不能一直指望导航栏的静态高度,因为它可能会更改不同内容类型的高度。 在大多数情况下,这将由各种UINavigation类自动处理。 UIView上有一个新的safeAreaInsets.top属性,我们可以准确而可靠地使用它来通过导航栏知道“模糊”区域的大小。 还有一个底线值。 ( safeAreaInsets.bottom

您也可以使用safeAreaLayoutGuide

对于手动布局,您可以手动阅读safeAreaInsets并订阅安全区域大小的更改。

现在, UINavigationController不再像使用安全插入一样控制插入值,因此在Scroll View上设置手动插入应该不再像以前那样费时了。

UIScrollView具有称为contentInsetAdjustmentBehaviorcontentInsetAdjustmentBehavior新属性,可用于手动定义插图在UIScrollView上的行为。

UITableViewCell现在支持使用新的UIContextualAction类在左侧和右侧进行内置的滑动操作。 看起来与UITableRowAction工作原理类似,但是更加精致,因为您可以单独使用UISwipeActionsConfiguration对这些UIContextualAction进行分组。

UITableView上有一个新的属性,称为“ separatorInsetReference ,可让您设置插图的值是绝对值还是“增量”,例如,在引用中,插图将是以前的插图。

斯威夫特4和基金会

归档Swift本机类型

新的Codable协议允许更轻松地“存档”和“取消存档”,并且默认情况下允许他们参与NSCoding。

关键路径

新的KeyPath类型具有用于文字语法的选项(例如\Object.path.subPath ),因此您可以动态创建一个密钥路径,然后使用collection[keyPath: someKeyPath]

使用object.obserer(keyPath) { object, change in ... } 新的基于块的KVO(!!)

与状态栏和控制中心有关的触摸

在iOS 11中,我们可以添加一个新的preferredScreenEdgesDeferringSystemGestures()方法,您可以在其中返回UIRectEdge以显式设置要保护哪些边缘以防止系统覆盖触摸事件。

自动布局和ScrollView

您可以使用contentLayoutGuideframeLayoutGuide明确显示,在其中可以对滚动视图的框架设置约束,也可以对滚动视图本身的内容设置约束。

imageView.centerXAnchor.constraints(equalTo: scrollView.contentLayoutGuide.centerXAnchor)

imageView.centerYAnchor.constraints(equalTo: scrollView.contentLayoutGuide.centerYAnchor)

动态类型

确定适合用户动态字体大小的字体。
Oldschool的方法是向UIFont要求特定字体样式的PreferredFont。

引入了新的UIFontMetrics ,您可以为特定的文本样式进行实例化,该样式可以处理基于标准字体的缩放字体,该字体允许对动态类型使用自定义字体。

它还允许缩放一些任意的布局值,这意味着它可以根据您提供的standardValue返回缩放的值,因此它实际上为参与动态类型的文本容器计算正确的高度大小。

现在可以根据标签的动态类型为彼此动态设置基线的基线。

  lettopAnchor = topLabel.lastBaselineAnchor 
 让bottomAnchor = bottomLabel.firstBaselineAnchor 
  bottomAnchor.constraintEqualToSystemSpacing(以下:topAnchor) 

密码自动填充

iOS 11引入了一项新功能,如果它检测到“用户名和密码”情况,则会在自动填充栏中显示“钥匙”图标,因此您可以在从iCloud钥匙串登录时为特定应用选择自动填充密码。

应用程序还可以设置权利和其他配置(实际上也用于通用链接),这些配置将在自动完成栏中显示特定应用程序的操作。

资产目录中的命名颜色

现在,我们可以在资产目录中为颜色命名,以便在Interface Builder中使用。 这也适用于宽色域颜色。 现在,还可以根据您的应用程序所需的资产来对图标进行应用程序细化。

向量

我们可以使用PDF支持的图像,以便保留矢量数据。

这对于UITabBars非常有用,因为默认情况下它将创建与辅助功能相关的资产,而无需任何额外的代码。