ios13 防止下拉滚动到顶部的 tableView 关闭 sheet 模态呈现的样式 viewController

ios13 prevent pulling down on tableView which is scrolled to top from dismissing sheet style modally presented viewController

我有一个 tableViewController,它以默认的 sheet 样式显示模态显示。

我想保留这种模态样式,因为它看起来不错并且在我的应用程序中运行良好。我喜欢在下拉导航栏时解雇。但是我不想要的是下拉 tableView 单元格导致 tableViewController 在 tableView 已经滚动到顶部时被关闭。

有没有办法抑制这种行为,同时保持 sheet 风格的模态呈现?我希望下拉 tableView 以保持垂直弹跳效果,并且只能通过向下拉导航栏部分通过平移来关闭模态呈现的 tableViewController。

当用户开始在 table 视图上拖动时,您可以通过在 table 视图控制器上将 isModalInPresentation 设置为 true 来禁用下拉关闭行为,然后在他们停止拖动时将其重置回 false,如下所示:

class YourTableViewController: UITableViewController {
    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        isModalInPresentation = true
    }

    override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        isModalInPresentation = false
    }
}

请注意,您仍然可以稍微 拉下您的table 视图控制器,但至少您不能完全关闭它。由于拖动停止时该值设置回 false,因此您可以通过下拉导航栏来关闭。

此外,如果您将 UIRefreshControl 添加到 table 视图,它会在下拉 table 视图时禁用下拉关闭行为。