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

Posted

技术标签:

【中文标题】(Swift) UIPanGestureRecognizer 在视图上工作正常,直到添加子视图【英文标题】:(Swift) UIPanGestureRecognizer works fine on view until subview is added to it 【发布时间】:2017-09-06 06:11:52 【问题描述】:

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

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)

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

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
        
    


在我添加子视图之前(以及当我将其注释掉时),平移手势在超级视图上工作得非常好。但是,当我将子视图限制在超级视图的中心并尝试在视图控制器周围移动超级视图时,它的行为很奇怪(仅正确地向左移动,向右移动时不断地猛拉回到中心)。

非常感谢任何和所有帮助。

【问题讨论】:

尝试在superView.addSubview(subView)函数下面的superView中添加panGesture 你的意思是一旦你添加了子视图,你的平移手势就停止工作了吗? @Lion 正确,一旦我将我的 subView 添加到 superView 平移手势停止正常工作。 如果您将uiviewuiimageview 添加为子视图而不是将其用户交互设置为false,我认为它会起作用 @AravindAR 试过了,不幸的是仍然遇到同样的问题。 【参考方案1】:

在您的子视图上禁用userinteraction,我认为它会起作用!

你的代码应该是这样的,

  subView.isUserInteractionEnabled = false

【讨论】:

我试过了,不幸的是我仍然遇到同样的问题。【参考方案2】:

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

无论您是向左还是向右平移视图,我都将这两个选项都设为“是”来对此进行了测试。这解决了让我相信问题是图像被切换的问题,具体取决于您是向左还是向右滑动。我不知道为什么在显示两个不同的图像时会出现问题,但我也会尝试解决这个问题。

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

【讨论】:

以上是关于(Swift) UIPanGestureRecognizer 在视图上工作正常,直到添加子视图的主要内容,如果未能解决你的问题,请参考以下文章

swift [Swift Notes]在学习Swift #Swift的同时收集笔记

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别