Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios (Swift)UIPangestureRecognitor在视图上工作良好,直到将子视图添加到其中_Ios_Iphone_Swift_Xcode_Uipangesturerecognizer - Fatal编程技术网

Ios (Swift)UIPangestureRecognitor在视图上工作良好,直到将子视图添加到其中

Ios (Swift)UIPangestureRecognitor在视图上工作良好,直到将子视图添加到其中,ios,iphone,swift,xcode,uipangesturerecognizer,Ios,Iphone,Swift,Xcode,Uipangesturerecognizer,我有以下视图(它是全局视图控制器的子视图): 这里是我为它设置约束的地方: // constraints for super view func setupSuperView() { superView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true superView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActi

我有以下视图(它是全局视图控制器的子视图):

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

// 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)
}
这是我添加到superView内部的子视图(我将其视为容器视图):

及其制约因素:

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

}
在我添加子视图之前(以及当我注释掉它时),平移手势在superview上工作得非常好。但是,当我将子视图约束在superview的中心,并尝试围绕视图控制器移动superview时,它的行为会很奇怪(只是正确地向左移动,向右移动时会不断地回缩到中心)


非常感谢您提供的任何帮助。

在您的子视图上禁用
用户交互
,我想它会工作的

你的代码应该是这样的

  subView.isUserInteractionEnabled = false

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

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


感谢您的所有有用的输入

尝试将panGesture添加到下面的superView
superView。addSubview(subView)
Function您的意思是一旦添加子视图,您的pan手势就停止工作了吗?@Lion正确,一旦我将我的子视图添加到superView,平移手势将停止正常工作。如果您将
uiview
uiimageview
添加为子视图,则将其用户交互设置为
false
,它将正常工作think@AravindAR试过了,,不幸的是,我仍然遇到同样的问题。我尝试了这个,但不幸的是,我仍然遇到同样的问题。
 // 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
        }
    }

}
  subView.isUserInteractionEnabled = false