向下拖动以关闭ViewController

Edi*_*Edi 3 modal-dialog ios swift

我正在构建一个带有MKMapView背景的应用程序,我希望有一个"向上/向下滑动"的视图,就像在谷歌地图或Spotify(example.gif)中一样,可以通过拖动来解除它.

'上滑/下滑'将包含很多信息,包括a UITableView,所以我可能希望它有自己的ViewController,而不仅仅是一个UIView人.对此有什么好处?

是否可以"只"添加一个childViewController/ContainerView并给它一个UIPanGestureRecognizer?所有帮助表示赞赏!

hao*_*hao 8

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

第1章:容器

将视图控制器与地图视图视为视图控制器A.将上滑/下移视图视为视图控制器B.我们希望从A无缝过渡到B(和B到A).可可提供了这样的API,但首先你需要一个容器视图控制器同时包含A和B作为一个子视图控制器.这可以是导航控制器或您自己的自定义容器控制器.

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

拥有容器视图控制器后,对其进行编码,以便您可以通过按下按钮从A转到B并返回.(在你的应用程序的某个地方放一个调试按钮.)所以你点击一个按钮然后从A转到B然后再次点击它从B转到A.为此,有非交互式自定义容器视图控制器转换API(这是一口).这将需要实现动画控制器和转换委托,详见优秀的objc.io教程及其相应的GitHub存储库.

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

但是,当然,您希望用户上下滑动以触发转换.这将带您进入交互式blah blah blah API的世界,您可以在其中实现交互控制器并将其连接到平移手势识别器.该博客文章相应GitHub存储库实际上使用了像您一样的平移手势.这是特别挑剔的工作,因为如果用户决定在中途停止平移,您会希望取消转换,但所有这些都在代码和文章中详细说明.

第4章:查看共享

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

我自己有一个小型的演示项目,说明如何做到这一点.我所做的是我有一个导航控制器作为我的容器视图控制器.导航控制器的根视图控制器是我的主视图控制器(视图控制器A).在视图控制器中,我将控制器B视为孩子.因此,导航控制器拥有A拥有B.

当用户点击B时,我将B推到导航堆栈上,从而重新显示它.那时,我的非交互式动画控制器开始作为自定义导航控制器推送动画.因此看起来B很容易从它的小边界变形到更大的边界.(我建议运行xcodeproj来查看效果,因为我已经做了很糟糕的描述.)

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

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

也可以看看

您可以单击asciiwwdc.com页面右上角的紫色Apple徽标来观看会谈的视频或从"资源"选项卡中获取PDF.iOS的一些最佳文档被锁定在这些WWDC会谈中.