在子视图中未检测到UIGestureRecognizer

时间:2016-11-01 02:52:19

标签: ios swift uiview uigesturerecognizer

我创建了一个UIView子类,并在视图的右上角添加了一个圆形视图。然后我将UIPanGestureRecognizer添加到圆圈视图中。

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

如何将整个圆圈设为属性检测手势?

enter image description here

以下是我制作的UIView子类的完整类代码。

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)

}

}

1 个答案:

答案 0 :(得分:3)

通常情况下,超级视图范围之外的子视图没有触摸。

要更改此设置,您必须覆盖超级视图上的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
}