Ios 在UIView代码中创建的UIGestureRecognitor不工作

Ios 在UIView代码中创建的UIGestureRecognitor不工作,ios,uiview,interface-builder,uigesturerecognizer,uipangesturerecognizer,Ios,Uiview,Interface Builder,Uigesturerecognizer,Uipangesturerecognizer,我有一个自定义的UIStackView子类,里面有一些uiimageview。我希望视图接受平移手势来跟踪在其表面上的缓慢滑动。当我在Interface Builder中配置UIPangestureRecognitor时,它可以工作,但不能在代码中工作。以下是该课程的缩写版本: @IBDesignable class CustomView: UIStackView { private let panRecognizer = UIPanGestureRecognizer(target:

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

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

当我在星空视图中四处滑动时,没有输出打印。但是,如果我将平移手势识别器放到IB中的视图上,并将其连接到同一个选择器,它就可以正常工作。我遗漏了什么?

使您的PanRecognitizer变为lazy var,这样它的初始化将延迟到第一次使用以及设置堆栈视图帧时。像

    private lazy var panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(CustomView.singleFingerSwipe))
或 将PanRecognitizer的声明移动到AddSpirate调用之前的initializeProperties()方法。像

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

原因是当您使用“private let..”进行初始化时,目标设置为null,因此无法启动该方法。因为init稍后会被调用,并且没有为CustomView初始化对象。以下是使用let(常量)声明时的控制台日志:

自我识别器的打印说明: ; 目标=>

但是,当调用init后在方法中声明其lazy var或时,CustomeView的实例将一直生成,直到使用PanRecognitizer为止。控制台打印为:

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

在这里您可以看到目标已设置


另外,您可以使用调试器检查相同的问题

太棒了,谢谢!我不认为最初的视角会影响我的快乐。:)对不起,我用调试器检查过了,所以第一眼看到的就是这个问题。但是经过思考,这个手势是与视图而不是框架联系在一起的,所以我更深入地挖掘它,我发现原因是目标。对不起,那是我的错。