swift - 为什么我的 gestureRecognizer 返回零?

标签 swift uipangesturerecognizer

我尝试结合许多教程来尝试让手势识别器在 mapView 上收到手势后在 tableView 上启动动画(一旦 map 像旧的 uber 应用程序一样移动就会缩小表格)。动画功能,但是一旦动画完成,我收到“展开可选时意外发现 nil”——但它似乎不应该为 nil,显然它是,我只是不明白如何。错误是向下的 3/4,我试图减少尽可能多的代码,所以部分丢失了。我的猜测是我创建了 2 个导致问题的手势识别器,但我不确定如何组合它们。这是代码:

    class RestaurantsVC: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UIGestureRecognizerDelegate {

    var animator: UIViewPropertyAnimator?
    var currentState: AnimationState!
    var thumbnailFrame: CGRect!
    var panGestureRecognizer: UIPanGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(RestaurantsVC.handlePan(gestureRecognizer:)))
        panGestureRecognizer.delegate = self
        self.mapView.addGestureRecognizer(panGestureRecognizer)
}

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }


    @objc func handlePan (gestureRecognizer: UIPanGestureRecognizer) {
        let translation = gestureRecognizer.translation(in: self.view.superview)

        switch gestureRecognizer.state {
        case .began:
            startPanning()
            animator?.startAnimation()
        case .ended:
            let velocity = gestureRecognizer.velocity(in: self.view.superview)
            endAnimation(translation: translation, velocity: velocity)
        default:
            print("Something went wrong handlePan")
        }
    }


    func startPanning() {
        var finalFrame:CGRect = CGRect()
        switch currentState {
           // code
        }
        animator = UIViewPropertyAnimator(duration: 1, dampingRatio: 0.8, animations: {
        })
    }


    func endAnimation (translation:CGPoint, velocity:CGPoint) {

            if let animator = self.animator {
                self.panGestureRecognizer.isEnabled = false //(this line is where i get the error)//

                switch self.currentState {
                case .thumbnail:
                        animator.isReversed = false
                        animator.addCompletion({ _ in
                            self.currentState = .minimized
                            self.panGestureRecognizer.isEnabled = true
                        })
                case .minimized:
                        animator.isReversed = true
                        animator.addCompletion({ _ in
                            self.currentState = .thumbnail
                            self.panGestureRecognizer.isEnabled = true
                        })
                default:
                    print("unknown state")
                }
            }
    }
}

最佳答案

它是 nil 因为您实际上从未分配过它。

在您的 viewDidLoad() 函数中,您实际上是在重新定义一个隐藏实例变量的局部变量:

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(RestaurantsVC.handlePan(gestureRecognizer:)))
^ The 'let' keyword is redefining this variable at the local scope

您应该删除 let 声明,并将其分配为:

self.panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(RestaurantsVC.handlePan(gestureRecognizer:)))

关于swift - 为什么我的 gestureRecognizer 返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48566408/

相关文章:

ios - `UIPanGestureRecognizer` 在 iOS 中使用 VoiceOver 的用户无法访问

ios - UIPanGestureRecognizer 总是从位置 (0, 0) 开始移动

swift - 在 NSVisualEffectView 中使用自定义 NSTableRowView 时出现奇怪的文本颜色

ios - 在 GMSMapView 中检测平移手势

swift - 将标签移动到另一个标签内并使用 UIPanGestureRecognizer 检测它

ios - 如何以编程方式快速发送手势

ios - 当另一个 UIScrollView 滚动时停止动画 UIScrollView

ios - 从 Swift 4 的文件目录中删除用户选择的文件?

swift - "T?"和 "T??"有什么区别

swift - 10 _dyid_start - 迁移到 Swift 4 后线程崩溃