(Swift) 当在视图上添加子视图后,UIPanGestureRecognizer 在视图上的表现良好,但不再起作用。

6
我有一个以下的视图(它是整个视图控制器的子视图):
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
}()

这里是我设置它的限制条件:

// 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)
}

这是我添加到超级视图中的子视图(我将其视为容器视图):

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

    sv.translatesAutoresizingMaskIntoConstraints = false
    sv.contentMode = .scaleAspectFill        

    return sv
}()

还有它的限制:

// 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
}

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

 // 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
        }
    }

}

在我添加子视图之前(当我将其注释掉时),平移手势在父视图上正常工作。然而,当我将子视图限制在父视图的中心并尝试将父视图移动到视图控制器时,它会表现得很奇怪(只能向左移动,向右移动时不断地抽搐回到中心位置)。
非常感谢您的任何帮助。

尝试将panGesture添加到下面的superView中: superView.addSubview(subView)函数。 - Aravind A R
你的意思是一旦添加了子视图,你的平移手势就停止工作了吗? - Ketan Parmar
@Lion 正确,一旦我将我的子视图添加到父视图中,平移手势就无法正常工作了。 - evanhaus
如果您将 uiviewuiimageview 添加为子视图,则将其用户交互设置为 false,我认为它会起作用。 - Ketan Parmar
@AravindAR 尝试过了,不幸的是仍然遇到了同样的问题。 - evanhaus
2个回答

2

禁用你的子视图上的userinteraction,我想它会起作用!

你的代码应该像这样:

  subView.isUserInteractionEnabled = false

我尝试了这个,不幸的是我仍然遇到相同的问题。 - evanhaus

0

我找到了问题所在。虽然我不知道为什么这样做可以解决问题,但问题出在我用于左滑容器视图的“否”选项的图像导致整个视图表现异常,因为它是一张不同的图片。

我通过将两个选项都设置为“是”,无论您向左还是向右滑动视图,都进行了测试。这解决了问题,让我相信问题是由于根据您向左或向右滑动而切换图像引起的。我不知道为什么会有显示两个不同图像的问题,但我也会尝试找出原因。

感谢您提供的所有有用信息!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接