嵌入到iOS13模态viewController中时,自定义UIControl滑块不起作用

时间:2019-09-27 05:27:45

标签: modalviewcontroller ios13 uicontrol

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

原生UIKit UISlider不会执行此操作。您可以在automatic样式模式ViewController中平移UISlider,而不会出现问题。

UIScrollView具有touchesShouldCancel(in view: UIView),您可以在其中强制其允许在指定的视图中进行触摸,但是对于这种新型的模式呈现,我在文档中找不到任何内容。

3 个答案:

答案 0 :(得分:2)

您可以在gestureRecognizerShouldBegin上实现UIGestureRecognizerDelegate的{​​{1}},并返回UIControl的{​​{1}}

false

答案 1 :(得分:1)

如果在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;也不起作用

答案 2 :(得分:0)

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

答案似乎是:不要使用UIControl触摸事件方法。相反,像其他答案表示可行一样,请使用UIPanGestureRecognizer和委托方法gestureRecognizerShouldBegin

一直以来的麻烦是试图像苹果文档所说的那样使用UIControl。