图层树通常都是指图层树模型。在iOS中,屏幕每秒60帧,如果动画时长大于1帧的时长,CoreAnimation就需要在设置一次新值及其生效时间,来对屏幕上的图层进行重新组织。那么,Core Animation是如何判断出layer当前位置以及将要到达的位置的呢?
每个图层属性的显示值都被存储在一个presentationLayer的独立图层当中,它实际上是模型图层的复制,但是它的实时值代表了在任何时刻这个layer的外观效果。
呈现图层仅仅当图层首次被提交,即第一次在屏幕上显示的时候创建,所以在那之前调用presentationLayer将返回nil。
动画发生时,原layer将会被隐藏,动画停止后才生效。另一个图层属性modelLayer即可以被看作是原layer。通常在一个图层上调用modelLayer会返回self(已经创建的原始图层就是一种数据模型)。
下面的代码,可以帮助我们更好的了解呈现/模型图层:
@interface ViewController ()
@property(nonatomic,strong)CALayer*layerFirst;
@property(nonatomic,strong)CALayer*layerSecond;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor=[UIColor orangeColor];
self.layerSecond=[CALayer layer];
self.layerSecond.frame=CGRectMake(0, 0, 40, 40);
self.layerSecond.position=CGPointMake(30, 64+30);
self.layerSecond.backgroundColor=[UIColor greenColor].CGColor;
[self.view.layer addSublayer:self.layerSecond];
self.layerFirst=[CALayer layer];
self.layerFirst.frame = CGRectMake(0, 0, 100, 100);
self.layerFirst.position = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height /2);
self.layerFirst.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.layerFirst];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint point = [[touches anyObject] locationInView:self.view];
if ([self.layerFirst.presentationLayer hitTest:point]) {
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
self.layerFirst.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
}
else if ([self.layerSecond.modelLayer hitTest:point]) {
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
self.layerSecond.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
}
else {
[CATransaction begin];
[CATransaction setAnimationDuration:6.0];
self.layerFirst.position = point;
CGPoint point1=point;
point1.x=point.x+100;
self.layerSecond.position=point1;
[CATransaction commit];
}
}
@end
点击屏幕不同的的位置,并观察layer颜色
- 在移动的过程中或不移动时,若点击layerFirst时,颜色均会立马变化;
- 而在移动的过程中点击layerSecond时,则颜色不会变化,不移动的时才会变化。
网友评论