延时执行:

使用控件的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)、代理设计模式的更多相关文章

  1. iOS中延时执行的几种方式的比较和汇总

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  2. UITableViewController和延时执行、自定义控件

    1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...

  3. IOS中延时执行的几种方式的比较

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  4. mysql定时执行及延时执行,实现类似sql server waitfor功能

    熟悉SQL Server的人都知道,它有一个很有用的功能,waitfor time和waitfor delay,前者表示在某个时间执行,后者表示等待多长时间执行.在我们测试功能和定时执行的时候特别有用 ...

  5. iOS延时执行的四种方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. javascript 延时执行函数

    延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...

  7. iOS开发之延时执行

    方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch ...

  8. 同时对view延时执行两个动画时候的现象

    同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...

  9. iOS:延时执行的三种方式

    延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器   第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...

随机推荐

  1. Docker 备份、恢复、迁移数据卷

    可以利用数据卷对其中的数据进行进行备份.恢复和迁移. 备份 首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录. ...

  2. Python3 注释

    确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以#开头,例如: #!/usr/bin/python3 #coding=utf-8 ...

  3. dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器

    # dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器 #环境centos 7.4 docker 18.03.0-ce # nuxus,创建maven本地源(可 ...

  4. springMVC源码分析--ModelAndViewContainer和ModelMap

    ModelAndViewContainer主要是用来返回Model对象的,在ModelAndViewContainer中有defaultModel和redirectModel, defaultMode ...

  5. Dynamics CRM 打开数据加密报错及修改用户邮件保存报错的解决方法

    在项目里会碰到在修改用户的电子邮件时报错的问题 然后跑到数据管理里打开数据加密又是报错 解决上述问题只需要做下数据库的更改即可,把标志位置1即可,记得要重启下IIS才能生效 SELECT [Colum ...

  6. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  7. iOS 10.0之前和之后的Local Notification有神马不同

    在iOS 10.0之前apple还没有将通知功能单独拿出来自成一系.而从10.0开始原来的本地通知仍然可用,只是被标记为过时.于是乎我们可以使用10.0全新的通知功能.别急-让我们慢慢来,先从iOS ...

  8. Android线性布局

    线性布局 LinearLayout 是一个视图组,用于使所有子视图在单个方向(垂直或水平)保持对齐. 您可以使用 android:orientation 属性指定布局方向. LinearLayout ...

  9. centos7安装jdk,tomcat,msyql(MariaDB)

    操作系统版本 CentOS Linux release 7.2.1511 (Core) 安装jdk 下载jdk-8u66-linux-x64.rpm上传到linux上 先改用户权限 然后 rpm -i ...

  10. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...