【问题标题】:Custom UIControl slider doesn't work when embedded in iOS13 modal viewController嵌入 iOS13 模态视图控制器时,自定义 UIControl 滑块不起作用
【发布时间】:2020-01-27 09:55:06
【问题描述】:

当我将自定义 UIControl 嵌入到以新的 iOS13 自动样式模态呈现的 ViewController 中时,只要平移手势移动超过几个点,就会调用 touchesCancelled

原生 UIKit UISlider 不会这样做。您可以毫无问题地在 automatic 样式模式 ViewController 中平移 UISlider。

UIScrollView 有 touchesShouldCancel(in view: UIView),您可以在其中强制它允许在指定视图中进行触摸,但我在文档中找不到任何关于这种新模式演示风格的内容。

【问题讨论】:

    标签: modalviewcontroller ios13 uicontrol


    【解决方案1】:

    您可以在您的UIControl 上实现gestureRecognizerShouldBeginUIGestureRecognizerDelegate 并返回false 如果它属于UIPanGestureRecognizer

    //MARK: UIGestureRecognizerDelegate
    extension RangeSlider: UIGestureRecognizerDelegate {
        public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
            return !(gestureRecognizer is UIPanGestureRecognizer)
        }
    }
    

    【讨论】:

    • gestureRecognizerShouldBegin 不会响应模态呈现视图的平移而被调用
    【解决方案2】:

    如果您在UITableViewCell 中使用范围滑块,这将捕获来自UIGestureRecognizerDelegate 的事件。虽然奇怪gestureRecognizerShouldBegin 也没有在这里触发。不是最佳的,但也许其他人在注意到这一点后有了新的想法。

    extension RangeTableViewCell {
    override func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        // Very hackish but there is no other option I've found for now
        // Consider using a custom modal presentation style and transition
        // this gesture actually makes the range slider call cancelTracking so we disable it
        if otherGestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer.view?.className.contains("UIDropShadowView") ?? false {
            otherGestureRecognizer.isEnabled = false
        }
        return false
    }
    

    }

    PS:我尝试将上述函数用作return otherGestureRecognizer is UIPanGestureRecognizer;也没有用

    【讨论】:

      【解决方案3】:

      问题似乎在于使用UIControl 函数touchesBegantouchesMovedtouchesEndedtouchesCancelled 的覆盖来观察阻力。这些触摸事件无法像UIGestureRecognizerDelegate 那样被拦截,因此无法阻止模态拖动强制touchesCancelled

      答案似乎是:不要使用UIControl触摸事件方法。相反, - 就像其他答案表明有效 - 使用UIPanGestureRecognizer 和委托方法gestureRecognizerShouldBegin

      一直以来的麻烦在于尝试按照 Apple 文档所说的那样使用 UIControl。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多