【问题标题】:UIGestureRecognizer created in UIView code not working在 UIView 代码中创建的 UIGestureRecognizer 不起作用
【发布时间】:2018-06-24 15:49:06
【问题描述】:

我有一个UIStackView 的自定义子类,里面有一些UIImageViews。我希望视图接受平移手势以跟踪其表面的缓慢滑动。当我在 Interface Builder 中配置 UIPanGestureRecognizer 时,它可以工作,但不能在代码中使用。这是该类的缩写版本:

@IBDesignable
class CustomView: UIStackView {

    private let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(CustomView.singleFingerSwipe))


    override init(frame: CGRect) {
        super.init(frame: frame)

        initializeProperties()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        initializeProperties()
    }

    @IBAction
    private func singleFingerSwipe(_ sender: UIPanGestureRecognizer) {
        print("Panning...")
    }

    private func initializeProperties() {
        addGestureRecognizer(panRecognizer)

        for _ in 1...3 {
            let imageView = UIImageView(image: UIImage(named: "MyImage"))
            imageView.translatesAutoresizingMaskIntoConstraints = false
            imageView.isUserInteractionEnabled = true

            addArrangedSubview(imageView)
            imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor).isActive = true
            imageView.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
        }
    }
}

当我在星形视图内滑动时,没有输出打印。但是,如果我将 Pan Gesture Recognizer 放到 IB 中的视图上并将其连接到同一个选择器,它就可以正常工作。我错过了什么?

【问题讨论】:

    标签: ios uiview interface-builder uigesturerecognizer uipangesturerecognizer


    【解决方案1】:

    使您的 panRecognizer 惰性 var 使其初始化延迟到第一次使用和设置堆栈视图帧的时间。喜欢

        private lazy var panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(CustomView.singleFingerSwipe))
    

    或 在 addGesture 调用之前将 panRecognizer 的声明移动到 initializeProperties() 方法。喜欢

    let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(CustomView.singleFingerSwipe))
    addGestureRecognizer(panRecognizer)
    

    编辑

    原因是目标设置为 null,因此当您使用“private let ..”进行初始化时,它无法触发该方法。由于稍后会调用 init 并且未为 CustomView 初始化对象。这是使用 let(constant) 声明时的控制台日志:

    self.panRecognizer 的打印说明: ; target= )>>

    但是当调用它的lazy var或者在init之后的方法中声明时,直到使用panRecognizer时,才会生成CustomeView的实例。控制台打印是:

    self.panRecognizer.storage.some 的打印说明: ;目标= >

    在这里你可以看到目标已经设定。

    附:您可以使用调试器进行检查

    【讨论】:

    • 太棒了,谢谢!我认为初始化时的视图框架并不重要
    • 我的荣幸。 :)
    • 对不起,我用调试器检查过,所以乍一看这是我遇到的唯一问题。但是在认为手势与视图而不是框架相关之后,所以我更深入地挖掘它,我发现的原因是目标。抱歉,这是我的错误。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多