自定义UIView中UIButton点击无响应且父视图背景不显示问题排查
问题原因说明
1. 按钮点击无响应原因
在CustomButtonView的initWithFrame方法中,你手动设置了self.userInteractionEnabled = NO,关闭了父视图的用户交互能力。iOS触摸事件传递规则为:事件从窗口逐层向下传递到响应者,若父视图关闭用户交互,所有子视图都无法接收触摸事件,哪怕子视图单独设置userInteractionEnabled = YES也不会生效。
2. 自定义视图红色背景不显示原因
两个因素共同作用导致该问题:
- 你给
CustomButtonView设置了translatesAutoresizingMaskIntoConstraints = NO,但没有给它添加任何固定宽高约束,也没有通过子视图约束撑满父视图,此时CustomButtonView的尺寸默认由子视图的固有内容尺寸、子视图和父视图的约束共同决定。 - 你仅给按钮添加了
topAnchor和leadingAnchor与父视图对齐的约束,没有给按钮添加宽高约束,也没有约束按钮的底部、尾部和父视图对齐。UIButton本身存在根据文字、字体计算的固有内容尺寸,此时CustomButtonView的尺寸会和按钮尺寸完全一致,绿色按钮刚好完全覆盖红色父视图背景,因此看不到红色。
修复方案
- 移除
CustomButtonView中self.userInteractionEnabled = NO这行代码,恢复父视图的用户交互能力。 - 给
CustomButtonView添加固定宽高和位置约束,示例代码:
// 在ViewController的viewDidLoad方法中,添加customButtonView之后补充约束 [_customButtonView.widthAnchor constraintEqualToConstant:100].active = YES; [_customButtonView.heightAnchor constraintEqualToConstant:100].active = YES; [_customButtonView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:20].active = YES; [_customButtonView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor constant:20].active = YES;
- 如果需要按钮撑满自定义视图,补充按钮的宽高约束即可:
// 在CustomButtonView的initWithFrame方法中,补充按钮约束 [_button.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES; [_button.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
- 如果需要露出红色背景,给按钮添加带边距的约束即可,比如上下左右各缩进10pt,红色就会作为按钮边框露出。
内容的提问来源于stack exchange,提问作者mtk2021
相关产品推荐
相关产品推荐

