当我尝试使用 Swift 将其添加到自定义 UIView 时,UITapGesture 不起作用

问题描述 投票:0回答:1

我使用 Xcode 15.1。

我创建了一个 CustomView 以在我的项目中使用

class CustomView: UIView {

@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var childView: UIView!
@IBOutlet weak var buttonView: UIView!

override init(frame: CGRect) {
    super.init(frame: frame)
    dprint("CustomView init frame")
    viewInit()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    dprint("CustomView init coder")
    viewInit()
}

func viewInit() {
    let xibView = Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)![0] as! UIView
    addSubview(xibView)
}

}

因此,我尝试使用以下代码在 UIVIewController 中调用此自定义视图:

    let cv = CustomView()
    self.view.addSubview(cv)
    HelperXib.setCenteredXibContraints(cv, self.view)

struch HelperXib {
  static func setCenteredXibContraints(_ sameView:UIView, _ parentView: UIView) {
    // for errorView message that show on center, example: AlertNoPixKey
    sameView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        sameView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor),
        sameView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor),
    ])
  }
}
    

该视图在我的屏幕上完美显示,然后我尝试使用代码在自定义视图中使用我的 UIView(buttonView) 之一来响应点击事件。

    let tap2 = UITapGestureRecognizer(target: self, action: #selector(ChargeEnterDataViewController.redirectToMyKeys(_:)) )
    cv.buttonView.addGestureRecognizer(tap2)
    cv.buttonView.isUserInteractionEnabled = true

不幸的是,当我点击屏幕上的buttonView UIView 时没有任何反应。

我怎样才能让它发挥作用?

编辑:

我发现了一些奇怪的事情。我尝试使用

print("cv.frame.size: \(cv.frame.size)")
print("cv.buttonView.frame.size: \(cv.buttonView.frame.size)")

它在 Xcode 控制台上显示了这一点

cv.frame.size: (0.0, 0.0)
cv.buttonView.frame.size: (240.0, 49.0)

由于某种原因,cv UIView 的宽度和高度变为 0.0。不知道为什么会发生这种情况。也许这可能是因为 tapGesture 不起作用的原因。

ios swift uikit uitapgesturerecognizer
1个回答
0
投票
let cv = CustomView()
self.view.addSubview(cv)

所以 cv 没有大小。所以它的所有子视图都在它的范围之外。所以他们看得见,摸不着;默认情况下,超级视图边界之外的视图无法通过命中测试。

要提供帮助,请说

cv.clipsToBounds = true
。现在,在解决问题之前,您甚至不会看到它的子视图。

© www.soinside.com 2019 - 2024. All rights reserved.