如下:

CGRect imageRect = (CGRect){, , , };
UIImageView *imageView = [[[UIImageView alloc] initWithFrame:imageRect] autorelease];
imageView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:imageView];
UIButton *maskBtn = [UIButton buttonWithType:UIButtonTypeCustom];
maskBtn.frame = imageView.bounds;
maskBtn.backgroundColor = [UIColor redColor];
[maskBtn addTarget:self action:@selector(maskBtnDidClick:) forControlEvents:UIControlEventTouchUpInside];
[imageView addSubview:maskBtn];

结果点击按钮不响应事件,小纠结了一下,在SO上得到信息:

UIImageView has userInteractionEnabled set to NO by default. You are adding the button as a subview to the image view. You should set it to YES.

所以,添加了一行代码,设置imageView响应用户交互即可:

CGRect imageRect = (CGRect){, , , };  

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:imageRect] autorelease];  

imageView.backgroundColor = [UIColor yellowColor];  

[self.view addSubview:imageView];  

imageView.userInteractionEnabled = YES;
UIButton *maskBtn = [UIButton buttonWithType:UIButtonTypeCustom];
maskBtn.frame = imageView.bounds;
maskBtn.backgroundColor = [UIColor redColor];
[maskBtn addTarget:self action:@selector(maskBtnDidClick:) forControlEvents:UIControlEventTouchUpInside];
[imageView addSubview:maskBtn];

这纯粹就是一个知识点引发的坑,因为以前在UIImageView上都是使用TapGesture来响应用户交互的,所以对这个坑没有太大印象 —— 我遇到过没?

上面代码所构建的视图层级大致如下:

其中红色方框代表的是UIImageView上的UIButton按钮。

参考View Programming Guide for iOS文档,当用户在红色按钮上点击了一下后:

1. 硬件设施会通知UIKit有触摸事件;

2. UIKit将触摸事件信息封装成UIEvent对象,分发给合适的视图;

1) UIKit将事件对象放到当前App的事件队列中;

2) 参考Event Handling Guide for iOS文档,当前App会从事件队列取出一个事件对象,然后发送给key window对象;

3) key window对象通过Hit-Testing获取触摸事件发生时所在的视图对象;

4) 通过Hit-Testing获得的视图成为第一个可以响应事件的对象,first responder,如果它不响应,则事件对象会沿着响应者链传递。响应者链,即Responder Chain,是由first responder到当前App对象所构成的一串对象,它们都继承于UIResponder类;

P.S. 具体描述可以见此文档

3. 找到合适的处理事件的对象,比如上面代码是self(ViewController),响应事件做些事情;如果找不到就丢弃掉。

UIImageView中的UIButton不响应事件解决方案的更多相关文章

  1. .NET aspx页面中的按钮无法响应事件

    原因只有一个,页面中存在多个form标签.按Ctrl+F,找到多余的删掉即可

  2. 「iOS造轮子」之UIButton 用Block响应事件

    俗语说 一个不懒的程序员不是好程序员 造轮子,也只是为了以后更好的coding. coding,简易明了的代码更是所有程序员都希望看到的 无论是看自己的代码,还是接手别人的代码 都希望一看都知道这代码 ...

  3. UIButton无法响应点击事件

    一.问题描述 因为项目需要,需要UITableView上添加固定的筛选表头,一直固定,不能随UITableView滚动.所以直接将表头与UITableView分离,将它添加到控制器的UIView上,即 ...

  4. 解决UIButton 连续点击重复响应事件问题

    经常会遇到重复点击某个按钮 事件被响应多次的情景, 有时候可能对程序本身并没有什么影响 , 可有时候偏偏需要限制button响应事件直接的间隔 . 方法一 : 标记 1 . 利用空闲enable属性来 ...

  5. 从uibutton的点击谈谈ios的响应事件

    最近在做一个项目,接连遇到两个关于点击事件的问题. 1.点击button不能响应事件的. 2.子view的frame超出了父view的容器大小,也不能响应点击事件. 效果图如右: 1.第一张图中的弹出 ...

  6. wemall app商城源码中android按钮的三种响应事件

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码中android按 ...

  7. 解决UIScrollView,UIImageView等控件不能响应touch事件的问题

    关于UIScrollView,UIImageView等控件不能响应touch事件,主要涉及到事件响应者链的问题,如果在UIScrollView,UIImageView等控件添加了子View,这样事件响 ...

  8. 3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

    在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slic ...

  9. 3D场景中的鼠标响应事件

    原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...

随机推荐

  1. kotlin集合操作

    1.1 总数操作 方法作用: any--判断集合中是否有满足条件 的元素: all--判断集合中的元素是否都满足条件: count--查询集合中满足条件的元素个数: fold--在给定初始值的基础上, ...

  2. propTypes

    [propTypes] React.PropTypes is deprecated as of React v15.5. Please use the prop-types library inste ...

  3. Cacti日志时区问题

    cacti默认是以美国的时间为准的,监测的适合要纠正到UTC+8的时区. 打开vi /home/cacti/include/config.php 文件,在里面加入一行 date_default_tim ...

  4. day25 面向对象之多态和鸭子类型

    1.封装方法 如何封装:给方法名称前面加上双下划线 # ATM 的取款功能 # 1.插入银行卡 2.输入密码 3.选择取款金额 4.取款 class ATM: def __insert_card(se ...

  5. java搭建web从0-1(第一步:创建web工程)

    intellij idea版本:2017 1.新建一个web工程 使用工具intellij ideal,注意:只有Ultimate版本的可以新建web工程,社区版本的不支持新建web工程   File ...

  6. appium多机并行测试

    在实际应用中需要对多个机型并行测试,节省时间 多机测试的思路 启动多个appium server与多台机器交互(android和ios均可)   注意:一定要使用node安装appium的命令行,使用 ...

  7. jquery mobile两个页面以及源码(登录与注册) 转

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  8. 五 shutil模块

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...

  9. python基础入门学习2

    python 整体注释:选中所有然后CTRL+? 运算符 + - * /   **  %  // 布尔值 true 真  False 假 !=不等于 <>不等于 算数运算,赋值运算,比较运 ...

  10. linux下的ping工具--fping

    前言:       如果想ping 大量的不连续的地址,有想知道放回结果,在linux系统下有一个非常合适的工具--fping. Fping 官网:http://www.fping.org/ Fpin ...