如何让UIView的指定部分可点击,仅响应特定子控件的点击事件
实现方案
你可以根据后续需求灵活选择以下两种实现方式:
方案1:直接给Label2添加点击手势(最简实现,适合固定仅Label2响应的场景)
UILabel默认关闭用户交互,所以需要先手动开启交互,再绑定手势即可:
- 开启Label2的用户交互权限:
label2.isUserInteractionEnabled = true - 给Label2添加点击手势识别器,绑定触发逻辑
代码示例:
// 在自定义View的初始化或布局完成的生命周期中添加 let label2Tap = UITapGestureRecognizer(target: self, action: #selector(onLabel2Clicked)) label2.addGestureRecognizer(label2Tap) label2.isUserInteractionEnabled = true // 点击触发的回调方法 @objc private func onLabel2Clicked() { // 这里写你的点击处理逻辑 }
方案2:重写自定义View的hitTest方法(灵活可控,适合后续需要调整响应区域的场景)
通过重写视图的点击事件判定方法,统一控制整个自定义View的响应区域,点击落在Label2之外的范围直接放弃响应:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { // 将当前点击坐标转换为Label2坐标系下的坐标 let convertPoint = convert(point, to: label2) // 判定点击是否落在Label2范围内 if label2.bounds.contains(convertPoint) { return super.hitTest(point, with: event) } // 其余区域不响应交互 return nil }
效果参考布局

注意事项
- 两种方案都不需要修改Image、Label1以及StackView的交互属性,非指定区域的点击会自动被忽略
- 如果自定义View本身还有其他全局交互逻辑,优先选方案2做统一管控
内容的提问来源于stack exchange,提问作者Allan Snicker
相关产品推荐
相关产品推荐

