如何禁用通过present呈现的UIViewController拖拽关闭功能?
禁用模态视图的拖拽关闭功能
看来你已经试了几种方法,但系统默认的拖拽关闭还是没被禁用对吧?别着急,这是因为你没找对系统默认模态交互的控制方式,我来给你说两个有效的解决方案:
方法一:设置isModalInPresentation为true(推荐)
这是iOS 13及以上系统提供的最直接的方法,设置后系统会阻止用户通过拖拽或点击背景关闭模态视图,必须通过代码调用dismiss(animated:completion:)才能关闭。
你只需要在viewDidLoad里添加这一行代码:
override func viewDidLoad() { super.viewDidLoad() self.isModalInPresentation = true // 你的其他代码... }
这个属性的作用就是标记当前模态视图为「必须手动通过代码关闭」,系统会自动禁用所有默认的关闭交互(包括拖拽下滑、点击背景)。
方法二:针对Sheet样式的额外配置(可选)
如果你的视图是iOS 15及以上默认的Sheet样式,除了上面的设置,还可以配合SheetPresentationController的属性进一步限制交互,但上面的方法已经足够禁用拖拽关闭了。如果需要更精细的控制,可以添加:
override func viewDidLoad() { super.viewDidLoad() self.isModalInPresentation = true if let sheet = self.sheetPresentationController { // 禁止滚动展开(如果你的视图有滚动控件的话) sheet.prefersScrollingExpandsWhenScrolledToEdge = false // 让Sheet在紧凑高度下固定在边缘 sheet.prefersEdgeAttachedInCompactHeight = true } }
为什么你之前的方法无效?
- 设置
view.isUserInteractionEnabled = false:这个只会禁用你当前VC视图的交互,但系统的拖拽关闭手势是添加在模态容器视图上的,不是你的VC的view,所以这个设置对系统手势没用。 - 实现
UIViewControllerTransitioningDelegate的方法:这个是用来自定义转场动画和交互的,系统默认的拖拽关闭是内置的交互逻辑,不会走这个Delegate的方法,所以返回nil不会影响默认行为。
内容的提问来源于stack exchange,提问作者JamesVoo
相关产品推荐
相关产品推荐

