厌倦了仅为了实现drawRect就使用子类化UIView?
这是一个UIView的分类,可用于创建具有drawRect块的实例。
类似于这样
- (void)viewDidLoad {
[self.view addSubview:[UIView viewWithFrame:CGRectMake(20, 40, 60, 60)
drawRectBlock:^(CGRect rect) {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor);
CGContextFillRect(c, rect);
}]];
}
但是,当然,始终要小心使用 blocks。这种设置会让创建循环引用链变得非常容易。比如说,您想访问视图控制器上的一个属性,比如那个颜色,就可以这样做
- (void)viewDidLoad {
[self.view addSubview:[UIView viewWithFrame:CGRectMake(20, 40, 60, 60)
drawRectBlock:^(CGRect rect) {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(c, self.fillColor.CGColor);
CGContextFillRect(c, rect);
}]];
}
现在这个block会保留视图控制器,视图控制器会保留视图,视图会保留这个block,然后再返回来保留视图...
如果您使用的是iOS 5和ARC,可以这样做
- (void)viewDidLoad {
__weak MyViewController *weakRef = self;
[self.view addSubview:[UIView viewWithFrame:CGRectMake(20, 40, 60, 60)
drawRectBlock:^(CGRect rect) {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(c, weakRef.fillColor.CGColor);
CGContextFillRect(c, rect);
}]];
}
版权(C)2012 Hans Sjunnesson
在此特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人,免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、许可和/或出售软件副本的权利,并允许软件接收人进行此类操作,前提是受以下条件约束
上述版权声明和本许可声明应包含在软件的副本或实质性部分中。
软件按“原样”提供,不包括任何明示或暗示的保证,包括但不限于适销性、特定用途和版权。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是在合同、侵权或其他行为中产生的,无论这种情况是否与软件或其使用或其他交易有关。