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参数

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

在实际项目中碰到这类问题会继续更新到这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 719评论 0 1
  • ViewsBecause view objects are the main way your applicati...
    梁光飞阅读 641评论 0 0
  • 背景 接上篇,在理解什么是git后,总需要动手操作一下,还是那句话针对Git很熟练的大牛们可以点击返回或者关闭啦 ...
    泥阿布_Abner阅读 1,070评论 0 0
  • 唐僧四人上路那日,我站在凤撵之上,苦苦哀求:“御弟哥哥,你我在此恩爱一生,不比你辛苦西天取经来得快活吗?权利与真心...
    遇见而已阅读 1,856评论 37 55