UIPanGestureRecognizer 在 iOS 13 中不起作用

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 在 iOS 13 中不起作用【英文标题】:UIPanGestureRecognizer is not working in iOS 13 【发布时间】:2019-09-21 11:08:37 【问题描述】:

我们在 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)

我希望滑块可以在应用上运行。

【问题讨论】:

问题解决了吗?? 【参考方案1】:

我在 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
    ... 

【讨论】:

嗨,如果你能解决这个问题,请帮我解答一下我的问题吗?***.com/questions/58609831/…非常感谢 @FranticRock 你在说什么约束?请让我知道我被困在类似的位置。 . .

以上是关于UIPanGestureRecognizer 在 iOS 13 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UILongPressGestureRecognizer 上启用 UIPanGestureRecognizer

UIPanGestureRecognizer 在视图中使用 UIScrollView

在播放 UIAnimation 时执行 UIPanGestureRecognizer

UIPanGestureRecognizer - ImageView 在平移后快速回到原始位置

UIPanGestureRecognizer 干扰滚动

UIPanGestureRecognizer 弹出 UIViewController