You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:12:50