(Swift)UIPanGestureRecognizer在视图上工作正常,直到添加子视图

eva*_*aus 5 iphone xcode ios uipangesturerecognizer swift

我有以下视图(这是整个视图控制器的子视图):

lazy var superView: UIView = {
    let cv = UIView()

    cv.backgroundColor = .gray
    cv.translatesAutoresizingMaskIntoConstraints = false
    cv.layer.cornerRadius = 5     
    cv.layer.masksToBounds = true     
    cv.isUserInteractionEnabled = true
    cv.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(handlePan)))

    return cv
}()
Run Code Online (Sandbox Code Playgroud)

这是我为它设置约束的地方:

// constraints for super view
func setupSuperView() {
    superView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    superView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

    superView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -24).isActive = true
    superView.heightAnchor.constraint(equalTo: view.heightAnchor, constant: -200).isActive = true

    // ISSUE: For some reason, adding this subview with or without constraints screws up the pan functionality of the superview
    superView.addSubview(subView)
}
Run Code Online (Sandbox Code Playgroud)

这是我添加到superView内部的子视图(我将其视为容器视图):

lazy var subview: UIImageView = {
    let sv = UIImageView()

    sv.translatesAutoresizingMaskIntoConstraints = false
    sv.contentMode = .scaleAspectFill        

    return sv
}()
Run Code Online (Sandbox Code Playgroud)

其约束:

// constraints for yes/no view within superview
func setupSubView() {
    subView.centerXAnchor.constraint(equalTo: superView.centerXAnchor).isActive = true
    subView.centerYAnchor.constraint(equalTo: superView.centerYAnchor).isActive = true
}
Run Code Online (Sandbox Code Playgroud)

最后,这里是我为pan手势建立功能的地方:

 // pan functionality for swiping on superview
func handlePan(gesture: UIPanGestureRecognizer) {

    guard let superview = gesture.view else {
        return
    }

    // point you are tapped on
    let point = gesture.translation(in: view)

    // reference for how far left or right of the center of the superview your pan is
    let xFromCenter = superview.center.x - view.center.x

    // allows the superview to move with your finger
    superview.center = CGPoint(x: view.center.x + point.x, y: view.center.y + point.y)

    // dragged right
    if xFromCenter > 0 {
        subView.image = #imageLiteral(resourceName: "yes")
        subView.tintColor = UIColor.green

    // else dragged left
    } else {
        subView.image = #imageLiteral(resourceName: "no")
        subView.tintColor = UIColor.red
    }

    // when you let go
    if gesture.state == UIGestureRecognizerState.ended {
        // animate superview back to center where it originally was
        UIView.animate(withDuration: 0.2) {

            superview.center = self.view.center
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在我添加子视图之前(当我评论它时),pan手势在superview上运行得非常好.然而,当我约束子视图是在上海华中心,并尝试移动SuperView把周围的视图控制器,它的行为怪异(仅向左移动得当,不断抽搐回到中心向右移动时).

非常感谢任何和所有的帮助.

eva*_*aus 0

我想通了这个问题。虽然我不知道修复此问题的原因,但问题在于,我用于向左平移容器视图的“否”选项的图像导致整个视图行为异常,因为它是不同的图像。

我通过将两个选项设置为“是”来测试这一点,无论您向左还是向右平移视图。这解决了使我相信问题是图像根据您向左还是向右滑动而切换的问题。我不知道为什么它在显示两个不同的图像时出现问题,但我也会尝试解决这个问题。

感谢您提供的所有有用的意见!