iOS 13为模态呈现的视图控制器引入了modalPresentationStyle .pageSheet(及其兄弟姐妹.formSheet)的新设计…

我们可以通过向下滑动所呈现的视图控制器来取消这些表(交互式取消)。尽管新的“删除”功能非常有用,但它可能并不总是可取的。

问题:我们如何关闭交互式解雇? -请记住,我们保持演示风格不变。


当前回答

所有的解决方案都很好,但在我的情况下,我需要一个停止移动的选项。 这是一个代码。

如果你想阻止移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = false

如果你想解锁移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = true

其他回答

所有的解决方案都很好,但在我的情况下,我需要一个停止移动的选项。 这是一个代码。

如果你想阻止移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = false

如果你想解锁移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = true

属性isModalInPresentation可能会有所帮助。

从文档中可以看到:

当你将它设置为true时,UIKit会忽略视图控制器边界之外的事件,并防止视图控制器在屏幕上时被交互式丢弃。

你可以这样使用它:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)

选项1:

viewController.isModalInPresentation = true

(禁用交互式的。pagesheet撤销就像这样。)

从ios13开始,UIViewController包含了一个叫做isModalInPresentation的新属性,这个属性必须被设置为true以防止交互终止。 它基本上忽略了视图控制器边界之外的事件。如果你不仅使用自动样式,还使用。popover等表示样式,请记住这一点。 默认情况下,此属性为false。

来自官方文档:如果为真,UIKit将忽略视图控制器边界之外的事件,并阻止视图控制器在屏幕上的交互式撤销。


选项2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}

从ios13开始,UIAdaptivePresentationControllerDelegate包含了一个新的方法presentationControllerShouldDismiss。 此方法仅在呈现的视图控制器未以编程方式解散且其isModalInPresentation属性设置为false时被调用。

提示:不要忘记分配presentationController的委托。但是要注意,即使只是访问presentationController也会导致内存泄漏。

苹果在这个链接上分享了一个关于它的示例代码

它使用isModalInPresentation作为许多用户的建议。

如果你正在使用故事板来布局你的UI,我发现在使用导航控制器时禁用这种交互式撤销的最好方法是将导航控制器在属性检查器中的表示从自动更改为全屏。导航堆栈中的所有视图控制器都将是全屏的,用户无法将其解散。

属性检查器显示导航控制器的表示选项