在子视图上未检测到 UIGestureRecognizer

UIGestureRecognizer not detected on subview

我制作了一个 UIView subclass 并在视图的右上角添加了一个圆形视图。然后我将UIPanGestureRecognizer添加到圆视图中。

问题是只能识别位于超级视图上方的圆圈左下角的手势。

如何使整个圆圈成为 属性 检测到的手势?

以下是我制作的 UIView subclass 的完整 class 代码。

import UIKit

class ResizableImageView: UIView {


private let circleWidth: CGFloat = 40

var themeColor: UIColor = UIColor.magentaColor()

lazy var cornerCircle: UIView = {
    let v = UIView()

    v.layer.cornerRadius = self.circleWidth / 2
    v.layer.borderWidth  = 1
    v.layer.borderColor  = self.themeColor.CGColor

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(buttonTouchMoved) )
    v.addGestureRecognizer(panGesture)

    return v
}()





// Init

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

    setupSubviews()
    configureSelf()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}



func setupSubviews() {

    // Add cornerButton to self and set auto layout
    addSubview( cornerCircle )
    addConstraintsWithFormat("H:[v0(\(circleWidth))]", views: cornerCircle) // Extension code for setting auto layout
    addConstraintsWithFormat("V:[v0(\(circleWidth))]", views: cornerCircle)
    addConstraint(NSLayoutConstraint(item: cornerCircle, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .Right, multiplier: 1, constant: 0))
    addConstraint(NSLayoutConstraint(item: cornerCircle, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .Top,   multiplier: 1, constant: 0))


}

func configureSelf() {

    // Set border
    layer.borderWidth = 1
    layer.borderColor = themeColor.CGColor
}




// Gesture Event

func buttonTouchMoved(gestureRecognizer: UIPanGestureRecognizer) {

    let point = gestureRecognizer.locationInView(self)
    print(point)

}


}

ViewController

import UIKit

class ImageViewCheckController: UIViewController {

let imageView: ResizableImageView = {
    let iv = ResizableImageView()
    return iv
}()


override func viewDidLoad() {
    super.viewDidLoad()

    title = "ImageViewCheck"

    view.backgroundColor = UIColor.whiteColor()

    setupSubviews()
}

func setupSubviews() {
    view.addSubview( imageView )

    view.addConstraintsWithFormat("V:|-100-[v0(200)]", views: imageView)
    view.addConstraintsWithFormat("H:|-50-[v0(100)]", views: imageView)

}

}

通常情况下,不会触及其父视图范围之外的子视图。

要更改此设置,您必须重写父视图上的 hitTest(point:withEvent:) 以更改命中测试的工作方式:

override func hitTest(point: CGPoint, withEvent e: UIEvent?) -> UIView? {
    if let result = super.hitTest(point, withEvent:e) {
        return result
    }
    for sub in self.subviews.reverse() {
        let pt = self.convertPoint(point, toView:sub)
        if let result = sub.hitTest(pt, withEvent:e) {
            return result
        }
    }
    return nil
}