iOS CALayer 学习(4)


Layer Efficiency

绘制一个圆形的image

// clip to rounded rect
CGRect r = CGRectInset(rect, 1, 1);
[[UIBezierPath bezierPathWithRoundedRect:r cornerRadius:6] addClip];
// draw image
UIImage* im = [UIImage imageNamed: @"linen.jpg"];
// simulate UIViewContentModeScaleAspectFill
// make widths the same, image height will be too tall
CGFloat scale = im.size.width/rect.size.width;
CGFloat y = (im.size.height/scale - rect.size.height) / 2.0;
CGRect r2 = CGRectMake(0,-y,im.size.width/scale, im.size.height/scale);
r2 = CGRectIntegral(r2); // looks a whole lot better if we do this
[im drawInRect:r2];

Layer and Key-Value Coding

所有的layer属性都可以用键值编码的方式来访问。例如 layer.mask = mask;

我们可以写成: [layer setValue: mask forKey: @”mask”];

此外,CATransform3D和 CGAffineTransform值也可以通过键值编码的方式来访问:

self.rotationLayer.transform = CATransform3DMakeRotation(M_PI/4.0, 0, 1, 0);

我们可以写成:

[self.rotationLayer setValue:[NSNumber numberWithFloat:M_PI/4.0] forKeyPath:@"transform.rotation.y"];

但是由于CATransform3D没有rotation属性,所以你不能这样写:

self.rotationLayer.transform.rotation.y = //... No, sorry

这个转换的键路径,可以使用:rotation.x, rotation.y, rotation.z, rotation(same as rotation.z), scale.x, scale.y, scale.z, translation.x, translation.y, translation.z, and translation (two-dimensional, a CGSize).

上次我们说到,layer没有像view的tag这样的属性,没有 viewWithTag:这样的方法,我们如果需要识别layer,可以使用键值编码:

[myLayer1 setValue:@"Manny" forKey:@"name"];
[myLayer2 setValue:@"Moe" forKey:@"name"];

注意layer没有name属性。

CALayer还有一个类方法:defaultValueForKey: 为了实现它,你需要子类化CALayer,并重写这个方法。如果你想为某个键提供默认的值,你可以在这个方法里,返回你想要的值,否则,调用父类的方法。

最近的文章

iOS Animation 学习(1)

动画是属性随着时间的可视化变化。不断变化的属性,可能是位置:东西移动或改变大小。其他种类的属性也是可以是动画的。例如,视图的背景颜色可以从红色变为绿色,不是瞬间的,而是从一个到另一个褪色的可视变化。或认为可能会从不透明变成透明的,也不是瞬间的,而是可视的渐行渐远。如果没有帮助,我们大多数人会觉得动画遥不可及。有太多的并发问题 - 计算复杂,时机,屏幕刷新,线程,等等。幸运的是,帮助是有的。你不需要自己执行动画,你只需描述它,命令它,动画会为你执行。要求执行动画可以很简单,比如设置一个属性值...…

iOS继续阅读
更早的文章

iOS CALayer 学习(3)

Depth有两种方法来把layer放置在不同的深度。一个是通过zPosition属性,一个是通过转换来改变layer在z轴方向上的位置。 zPosition和在z轴上的转换是有联系的,从某种意义上,zPosition是z轴方向上的转换的一种速记方式(如果你同时提供zPosition和z轴的转换,只会令你迷惑)。在现实世界中,改变一个对象的zPosition会让这个对象变得更大或者更小,就像一个东西放近一点和放远一点,但是,默认情况下,layer的绘制并不是这样。layer会按照本身实际大小...…

iOS继续阅读