当我将自定义UIControl嵌入到以新的iOS13自动样式模态呈现的ViewController中时,只要平移手势移动了多个点,就会调用touchesCancelled
。
原生UIKit
UISlider
不会执行此操作。您可以在automatic
样式模式ViewController中平移UISlider,而不会出现问题。
UIScrollView具有touchesShouldCancel(in view: UIView)
,您可以在其中强制其允许在指定的视图中进行触摸,但是对于这种新型的模式呈现,我在文档中找不到任何内容。
答案 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
函数touchesBegan
,touchesMoved
,touchesEnded
和touchesCancelled
的重写来观察阻力。这些触摸事件无法像UIGestureRecognizerDelegate
那样被拦截,因此无法阻止强制touchesCancelled
的模式拖动。
答案似乎是:不要使用UIControl
触摸事件方法。相反,像其他答案表示可行一样,请使用UIPanGestureRecognizer
和委托方法gestureRecognizerShouldBegin
。
一直以来的麻烦是试图像苹果文档所说的那样使用UIControl。