手势未注册

时间:2019-09-08 16:21:36

标签: ios swift uitapgesturerecognizer uipangesturerecognizer

我有一个Pan和Tap手势,当我尝试在模拟器上激活它们时,它们似乎没有被识别。 我没有收到任何错误,尝试进行调试,似乎它确实分配了手势,但是不会调用我尝试使用的方法,就像它们根本无法识别它们一样。 这就是我所拥有的:

dismissIndicator: (Attaching the Pan recognizer to this view):
    let dismissIndicator: UIView = {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = UIColor.appWhite
        view.layer.cornerRadius = 15
        view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

        let dismissImg = UIImageView(image: UIImage(named: "closeArrow"))
        dismissImg.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(dismissImg)

        dismissImg.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        dismissImg.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        return view
    }()

这是我设置手势的方式:

let dimView = UIView()
let detailView = DetailsView()
var currentPost: Post? = nil

init(post: Post) {
    super.init()

    dimView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))

    let panGesture = PanDirectionGestureRecognizer(direction: .vertical(.down), target: self, action: #selector(panGestureRecognizerHandler(_:)))

    detailView.addGestureRecognizer(panGesture)

    setPostDetails(post: post)
}

这是handleDismiss(点击DimView时不会被调用:

@objc func handleDismiss(){
    UIView.animate(withDuration: 0.5) {
        self.dimView.alpha = 0
        if let window = UIApplication.shared.keyWindow  {
            self.detailView.frame = CGRect(x: 0, y: window.frame.height, width: self.detailView.frame.width, height: self.detailView.frame.height)
        }
    }
}

这是我的panGestureRecognizerHandler:

@objc func panGestureRecognizerHandler(_ sender: UIPanGestureRecognizer) {
    let touchPoint = sender.location(in: detailView.dismissIndicator.window)
    var initialTouchPoint = CGPoint.zero

    switch sender.state {
    case .began:
        initialTouchPoint = touchPoint
    case .changed:
        if touchPoint.y > initialTouchPoint.y {
            detailView.frame.origin.y = initialTouchPoint.y + touchPoint.y
        }
    case .ended, .cancelled:
        if touchPoint.y - initialTouchPoint.y > 300 {
            handleDismiss()
        } else {
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

                if let window = UIApplication.shared.keyWindow {
                    let height = window.frame.height - 80
                    let y = window.frame.height - height

                    self.dimView.alpha = 1
                    self.detailView.frame = CGRect(x: 0, y: y, width: self.detailView.frame.width, height: self.detailView.frame.height)
                }
            })
        }
    case .failed, .possible:
        break
    default:
        break
    }
}

这是我在屏幕上添加dimView和detailView的地方:

    func showDetailView(){
    if let window = UIApplication.shared.keyWindow {
        dimView.backgroundColor = UIColor(white: 0, alpha: 0.5)
        window.addSubview(dimView)
        window.addSubview(detailView)

        let height = window.frame.height - 80
        let y = window.frame.height - height // This is so we can later slide detailView all the way down.

        detailView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: height)

        dimView.frame = window.frame
        dimView.alpha = 0

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

            self.dimView.alpha = 1
            self.detailView.frame = CGRect(x: 0, y: y, width: self.detailView.frame.width, height: self.detailView.frame.height)
        })
    }
}

0 个答案:

没有答案