UIButton点击无效情况整理
1. isUserInteractionEnable问题
最常见的是将UIButton addSubview 进一个UIView后UIView的isUserInteractionEnabled是false的
不过UIView的isUserInteractionEnabled默认是true的,也就是如果在UIButton上面有一个UIView挡着它的话它也不会相应点击事件哟
目前发现UILabel是默认false的
let view = UIView()
let button = UIButton()
view.addSubview(button)
view.isUserInteractionEnabled = true
2. target function参数 【UIButton点击无效情况整理】target的方法参数值不对,这种情况属于action找不到合适的target。Swift3中建议使用#selector来设置action,以期望在编译期能够发现这样的输漏,感觉很棒,然而如果属于这种参数类型不对的,#selector也无法在编译期检测出来。
init(frame:CGRect){
super.init(frame:frame)
let button = UIButton()
button.addTarget(self, action:#selector(self.onButtonClick(sender:)), for UIControlEvents.touchUpInside)
}
func onButtonClick(sender:MyButtonClass){
// do somthing
}
3.superView frame & bounds UIButton addSuview进一个UIView(或别的UIView的子类中),显式的设置了UIButton的frame,使得UIButton可以正确的在界面上被看到,然而UIView的frame没有设置(这可能是因为不恰当的使用Snapkit或者其他自动布局导致),因此,就算设置了isUserInteractionEnable后,点击仍然不能触发事件,原因是,点击事件首先要被UIView接受到,然后才能传给UIButton,而UIView的frame可能根本就是一个CGRectZero,根本没有可以点击的区域,因此UIButton也无法接受到点击事件。可以通过
Xcode的Debug View Hierarchy发现这个问题。
3.1: 看似一切正常的页面底部点赞按钮(空心桃心处)
文章图片
配图3.1 3.2: 选择桃心按钮可以看到Button区域,其中UIButtonInCell是UIButton的子类
文章图片
配图3.2 3.3: 选择UIButtonInCell的superView:alltuu.PhotoViewerBottomIconButton,发现这个frame在Debug View Hierarchy中看不到
文章图片
配图3.3 3.4: 查看左侧的视图浏览器,view的结构如下图
文章图片
配图3.4 3.5: 发现alltuu.PhotoViewerBottomIconButton旁边有一个紫色的感叹号,说明这里有问题,把鼠标放在感叹号上,提示:width is ambiguous,也就是提示自动布局的约束条件不确定,因此frame的宽度不确定,所以frame看不到。
文章图片
配图3.5 在实际项目中碰到这类问题会继续更新到这里
推荐阅读
- javascript实现点击按钮变色
- 【MAUI】为|【MAUI】为 Label、Image 等控件添加点击事件
- JavaScript|Echarts5.* 关系图谱(relation graph)添加节点拖拽、点击节点高亮效果
- HTML+JS模拟实现QQ下拉菜单效果
- 芯片|(干货)全面分析6大国产CPU处理器
- React自定义hook之(useClickOutside——判断是否点击DOM之外区域)
- vue中radio根据动态值绑定checked无效的解决
- 大数据|一文理解 DDD 领域驱动设计!
- VUE|vue 实现点击“增加“”按钮,添加一个HTML元素
- xp系统关机没反应怎样办|xp电脑点击关机没反应