我该如何在Swift中将一个视图控制器呈现在另一个视图控制器内部?

3
我正在制作一个可搜索的列表应用程序。它将有一个“过滤”按钮,当单击该按钮时,将显示一系列过滤选项。
模态视图控制器应从右到左显示,并且不覆盖整个屏幕(如下所示)。
我已成功通过编程方式显示了一个视图控制器,覆盖了整个页面,但我无法找到如何动画打开视图控制器(从右到左),以及如何留出一些空间以查看其他视图控制器。它必须使用Swift。我看到了一些关于此的问题,但我能找到的所有问题都使用了Objective C和弃用的API。
谢谢
例子: eBay app
2个回答

7

毫无疑问,有多种方法可以实现此目的。

一种方法是将“容器视图”(它是IB对象列表中的特殊视图类型)添加到当前视图控制器中,并从容器视图控制拖动一个嵌入式segue到您想要托管的其他视图控制器场景。将容器视图放置在所需位置并调整其大小,并添加一个前导边缘约束以将其定位在该位置。

当您使用容器视图和嵌入式segue时,系统会处理所有需要进行的工作来托管子视图控制器。

将一个插座线连接到约束上。

在您的viewWillAppear方法中,将屏幕宽度 - 容器x添加到约束的常量中,并在内容视图上调用layoutIfNeeded(),使其无动画地移出屏幕。将您在viewWillAppear中添加到水平约束中的数量保存在一个实例变量中。

然后,当您想要将其动画显示在屏幕上时,请更改约束上的常量值(减去您在viewWillAppear中添加的数量),并在UIView animateWithDuration:animations:块内调用layoutIfNeeded()


0
你可以创建一个容器视图,并将其从右向左动画显示在屏幕上。
let containerView = UIView()
    containerView.addSubview(viewController.view)

1
实际上,如果您想在父/子关系中托管另一个视图控制器,您需要进行相当多的清理工作。您需要将子项添加到子视图控制器列表中,然后还有一些系统消息需要转发。最好在IB中使用容器视图,并使用嵌入式segue连接其他视图控制器,就像我在我的答案中描述的那样。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接