如下:

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. NTKO OFFICE文档控件

    目录 前言 什么是ntko 准备工作 实战演练 总结 一.前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便. ...

  2. springboot-day01-引入基础

    1. 今日大纲 1. 了解Spring的发展 2. 掌握Spring的java配置方式 3. 学习Spring Boot 4. 使用Spring Boot完成CRUD 2. Spring的发展 2.1 ...

  3. Gradle安装和在IDEA使用 基本操作

    阅读目录 简单介绍 安装 使用idea创建一个web的Gradle项目 如何进行打包 解释build.gradle和settings.gradle 有关gradle的jar冲突 本地jar包位置和修改 ...

  4. (django1.10)访问url报错Forbidden (CSRF cookie not set.): xxx

    问题:页面访问时报错 Forbidden (CSRF cookie not set.): xxx     解决方法: 修改settings.py文件,注释掉 django.middleware.csr ...

  5. oracle 存储过程模板

    CREATE OR REPLACEPROCEDURE PROCE_NAME(V_IN varchar2, V_OUT out varchar2) ASBEGIN --...  commit;  V_O ...

  6. ubuntu后台运行命令

    参考 https://blog.csdn.net/shaozg168/article/details/6979337 nohup ./test.sh &

  7. C#调用dll提示"试图加载格式不正确的程序"原因及解决方法

    转载:https://blog.csdn.net/songyi160/article/details/51354660 程序在32位操作系统上运行正常,在64位操作系统上运行读卡功能提示”试图加载格式 ...

  8. PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

    PHP使用UTF8编码读取ACCESS的乱码问题解决方案 http://it.xwstudy.com/readnews.php?id=627 来源:本站编辑 发布日期:2013-05-27 已有 17 ...

  9. 如何修改Eclipse的 workspace目录

    Eclipse是一款很强的Java IDE, eclipse ide for eclipse committers 这里的committers 就是投稿者与执行者的意思,也就是说这个eclipse是为 ...

  10. java实现person类 override(重写) comparable接口

    具体题目如下: 定义一个Person类,包含姓名(name).身高(height).体重(weight),以及talk()方法,该方法的功能是,输出自己的身高和体重信息.Person类实现Compar ...