【问题标题】:UIGestureRecognizer not detected on subview在子视图上未检测到 UIGestureRecognizer
【发布时间】:2016-11-01 02:52:18
【问题描述】:

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

问题是手势仅在圆圈位于超级视图上方的圆圈的左下部分被识别。

我怎样才能使整个圆圈属性检测到手势?

以下是我制作的 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)

}


}

视图控制器

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)

}

}

【问题讨论】:

  • 显示在控制器类中创建按钮的代码
  • 我添加了 ViewController 类代码

标签: ios swift uiview uigesturerecognizer


【解决方案1】:

通常,在其父视图范围之外的子视图不会被触摸。

要改变这一点,您必须在 superview 上覆盖 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多