(十一)延时执行、圆角(可实现圆形label)、代理设计模式
延时执行:
使用控件的performSelector...方法,例如用于移除,可以写在一行。
[lab performSelector:@selector(removeFromSuperview) withObject:lab afterDelay:4.0];
圆角的实现:
在iOS6中,只需要设定label.layer.cornerRadius即可实现圆角。
但是iOS7+中,需要将label.layer.masksToBounds设定为YES才行。
这牵扯到图层的概念。
在label内部有多个图层(对象),使用layer拿到的是主层,主层一般是用来容纳其他层。设置完主层的圆角后,子层盖在上面,会把主层的圆角盖住,因此要设置masksToBounds = YES,表示子层全部要遵循主层的边界。
还有一种方法是直接操作控件的clipsToBounds属性,表示剪掉超出边界的部分。
做法一:
lab.layer.masksToBounds = YES;
lab.layer.cornerRadius = 10;
做法二:
lab.clipsToBounds = YES;
lab.layer.cornerRadius = 10;
技巧:实现圆形label,尺寸为2R*2R,圆角为R即可。
如果要求在底层的View上面实现一个提示框(label),用父子关系来获取是很危险的,因为可能会改变视图的父子关系。因此使用self.superView直接拿到控制器是不稳定的。
方法一:给子View的控制器增加一个成员变量,用来存储底层View的控制器。这个方法的缺点在于会增加代码的耦合性(子View与底层控制器有粘连,不好移植)。
设计原则:一个独立的自定义View不能跟控制器有联系,为了能被多个控制器使用。
方法二:在子View的.h中暴露按钮,在底层View的控制器内给按钮addTarget,使得可以调用底层View的方法。由于暴露了内部内容,那么底层View与子View还是耦合的,去掉了子View后底层View就会受到牵连。
Tip:tag可以用来传递信息。
方法三:用代理处理
因为显示label要在底层View控制器,因此应该在子View中调用,但是在底层View的控制器中执行,因此要将底层View的方法委托出去,让控制器监听触发label显示的按钮(在子View中)。
过程总结:子View点击按钮->通知底层View控制器->执行控制器的label显示代码。
第一步,在子View中定义protocol:
@class AppData, AppView; @protocol AppViewDelegate <NSObject> @optional - (void)appViewClickedDownloadBtn:(AppView *)appView; @end
protocol中的方法一般声明为@option,表示不一定要实现。
第二步,在子View中定义delegate成员变量(定义在.h中确保可以设定):
@property (weak, nonatomic) id<AppViewDelegate> deleage;
第三步,在点击按钮时调用方法通知代理:
注意先用respondsToSelector来判断是否有此方法(@option造成可能没有实现这个方法)
if ([self.deleage respondsToSelector:@selector(appViewClickedDownloadBtn:)]) {
[self.deleage appViewClickedDownloadBtn:self];
}
第四步,底层控制器遵循protocol,并且实现相应的方法。
@interface ViewController () <AppViewDelegate>
控制器作为代理:
appView.deleage = self;
实现方法:
- (void)appViewClickedDownloadBtn:(AppView *)appView{
NSLog(@"Click");
}
代理的实质:通过delegate去调用代理的方法,为了保证方法的一致性,用protocol来约束。
(十一)延时执行、圆角(可实现圆形label)、代理设计模式的更多相关文章
- iOS中延时执行的几种方式的比较和汇总
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- UITableViewController和延时执行、自定义控件
1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...
- IOS中延时执行的几种方式的比较
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- mysql定时执行及延时执行,实现类似sql server waitfor功能
熟悉SQL Server的人都知道,它有一个很有用的功能,waitfor time和waitfor delay,前者表示在某个时间执行,后者表示等待多长时间执行.在我们测试功能和定时执行的时候特别有用 ...
- iOS延时执行的四种方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- javascript 延时执行函数
延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...
- iOS开发之延时执行
方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch ...
- 同时对view延时执行两个动画时候的现象
同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...
随机推荐
- Python 2.7 闭包的局限
想法源自:http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to- ...
- Python实现八大排序算法(转载)+ 桶排序(原创)
插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...
- Linux中查看文本文件内容命令cat/tac/nl/more/less/head/tail/vi总结
概述 在Linux系统下,有很多命令可以查看文本文件的内容,如cat/tac/nl/more/less/head/tail等命令,当然还有vi/nano等文本编辑器.在这里,我只介绍其中自己常用的一部 ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
- RxJava操作符(05-结合操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656736 本文出自:[openXu的博客] 目录: CombineLatest Join ...
- 多线程并发之java内存模型JMM
多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...
- 剑指offer-面试题7:俩个栈实现队列(c)
- React Native开发工具Nuclide使用
之前写RN的时候首选webstorm,这是之前做前端已经习惯的工具,其实RN开发官网推荐的是Nuclide工具, Nuclide是Fackbook专门为React开发IDE,今天也来尝试下,如果对we ...
- Servlet处理流程分析-Servlet学习之旅(二)
tomcat的处理处理客户端流程分析 tomcat即是servlet容器也具有web服务器的功能,即也具有html页面的功能. 1.首先客户端会将html请求发给tomcat内置的web服务器 2.w ...
- UNIX网络编程——名字与地址转换(gethostbyname,gethostbyaddr,getservbyname,getservbyport,getaddrinfo,getnameinfo函数)
名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IPv4地址之间进行转换.getservbyname和getservbyport在服务器名字和端口号之 ...