向下拖动以关闭ViewController

时间:2015-11-08 18:01:58

标签: ios swift modal-dialog

我正在构建一个以MKMapView为背景的应用,我希望有一个“上滑/下移”视图,就像在谷歌地图或Spotify(example.gif)中一样,可以通过拖拽来解散。

“向上/向下查看”会包含很多信息,包括UITableView,所以我可能希望它拥有自己的ViewController,而不仅仅是UIView单独{1}}。 这可能是一个很好的方法吗?

是否可以“只”添加一个childViewController / ContainerView并给它一个UIPanGestureRecognizer?感谢所有帮助!

1 个答案:

答案 0 :(得分:8)

不幸的是,这些视图控制器转换非常复杂,但有许多关于它们的在线教程。将子视图放入其自己的视图控制器中是正确的。还需要其他几个运动部件。完全详细说明这些内容将足以写出关于该主题的书籍,但高级概述是这样的:

第1章:容器

将视图控制器视为视图控制器A.将上滑/下移视图视为视图控制器B.我们希望无缝地从A转换为B(以及B转换为A)。 Cocoa提供了一个用于执行此操作的API,但首先您需要一个包含A和B作为子视图控制器的container view controller。这可以是导航控制器或您自己的自定义容器控制器。

第2章:非交互式自定义容器视图控制器转换

拥有容器视图控制器后,对其进行编码,以便按A按钮从A到B再返回。 (在你的应用程序的某个地方放一个调试按钮。)所以你点击一个按钮然后你从A到B然后你再次点击它从B到A.要做到这一点,有noninteractive custom container view controller transition APIs(它是满口)。这将需要实现动画控制器和转换委托,详见优秀的objc.io教程及其corresponding GitHub repository

第3章:交互式自定义容器视图控制器转换

但是,当然,您希望用户上下滑动以触发转换。这将带您进入interactive blah blah blah APIs的世界,您可以在其中实现交互控制器并将其连接到平移手势识别器。 corresponding GitHub repository to that blog post实际上像你一样使用平移手势。这是特别挑剔的工作,因为如果用户决定在中途停止平移,您会希望取消转换,但所有这些都在代码和文章中详细说明。

第4章:查看共享

我实际上不确定这叫什么。这里的问题是,当您在视图控制器A中时,您希望Google Maps / Spotify外观和视觉控制器B的视图的一部分实际可见。并且平移手势识别器附加到B的视图,以便在您滑动时B,视图变得越来越大,直到交互式动画结束,你已经从A转换到B.是否有一个很好的教程?我还没有找到一个,但它作为iOS用户界面的习惯用法变得越来越普遍。

我自己have a small demo project illustrating how to do this。我所做的是我有一个导航控制器作为我的容器视图控制器。导航控制器的根视图控制器是我的主视图控制器(视图控制器A)。在视图控制器中,我将控制器B视为孩子。因此,导航控制器拥有A拥有B。

当用户点击B时,我push B onto the navigation stack, thus reparenting it。此时,my noninteractive animation controller开始作为自定义导航控制器推送动画。因此看起来B很容易从它的小边界变形到更大的边界。 (我建议运行xcodeproj来查看效果,因为我已经做了很糟糕的描述。)

这种技术对于交互式动画也同样适用。至于它是否是最好的技术,我认为这是有争议的 - 有很多方法可以做你在Google Maps和Spotify应用程序中看到的内容。 Apple可以更好地记录复杂的交互式动画的API。

我会提醒您在调整动画并准备好动画之前避免使用自动布局,因为它与动画控制器没有很好的交互作用。在你找到你的轴承之前,好的'框架矩形数学是最好的。自动布局是神奇的,正如你可能能够分辨出这个答案的耗时长度,已经有足够的魔力可以绕过。

另见

您可以点击asciiwwdc.com页面右上方的紫色Apple徽标,观看会谈的视频或从资源标签中抓取PDF。 iOS的一些最佳文档被锁定在这些WWDC会谈中。