[我们已经在iOS 12中开发了一个应用程序,效果很好。现在,在iOS 13中,UIPanGestureRecognizer不再起作用。
我正在寻找解决方案,但没有找到任何东西。
@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
let translation = recognizer.translation(in: self.view)
if let view = recognizer.view {
let center = view.frame.origin.y + view.bounds.height / 2
if(center <= SliderView.bounds.height && center >= SliderView.bounds.minY) {
view.center = CGPoint(x:view.center.x, y:view.center.y + translation.y)
}
if(center > SliderView.bounds.height) {
view.center = CGPoint(x: view.center.x, y: view.center.y - 1)
}
if(center < SliderView.bounds.minY) {
view.center = CGPoint(x: view.center.x, y: view.center.y + 1)
}
lowerSliderView.frame = CGRect(x: 0, y: center, width: SliderView.bounds.width, height: SliderView.bounds.height - center)
slider = 1 - Float(center / SliderView.bounds.height)
slider = min(slider, 1.0)
slider = max(slider, 0.0)
}
recognizer.setTranslation(CGPoint.zero, in: self.view)
}
我希望滑块可以在该应用程序上使用。
我在iOS13上的手势识别器遇到类似的问题。 (在12天内工作正常)
我的问题是:我在上面设置了手势识别器的视图上设置了.center = someValue,但是该视图上也存在约束。当您对视图有约束时,iOS13似乎不喜欢它,并且还手动设置了它的框架。因此,我将代码完全转换为仅在手势识别器的处理程序方法中设置框架。如果您对该视图也有约束并正在调用layoutIfNeeded()导致布局通过,iOS13似乎在阻止您手动设置.center或.frame方面变得更加严格。我对此不太确定,但目前,我已使用手动框架设置来备份并运行。
如果您的手势识别器事件未触发,请尝试实现以下方法并检查其中的值,以查看是否存在其他手势识别器重叠并争夺触摸手势。为您的手势识别器返回TRUE,并抑制其他手势,或者为所有其他手势返回true。您需要先设置委托。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if (gestureRecognizer is UIPanGestureRecognizer || gestureRecognizer is UIRotationGestureRecognizer) {
print("Should recognize")
return true
} else {
print("Should NOT recognize")
return false
}
}
这是我的设置。当我从视图上移除所有带有识别器的约束后,现在可以正常工作了。约束正在“撤消”我在手势识别器方法中进行的转换,仅导致视图移动+1或-1,然后迅速恢复原位。
let recStart = UIPanGestureRecognizer(target: self, action: #selector(handleStartPan))
recStart.delegate = self
self.startView.addGestureRecognizer(recStart)
和handleStartPan:
@objc final func handleStartPan(_ gestureRecognizer: UIPanGestureRecognizer) {
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let translation = gestureRecognizer.translation(in: containerOfMyView)
// do stuff with translation.x or .y
...