iOS中的 呈现/模型 图层

2021-08-20  本文已影响0人  大成小栈

图层树通常都是指图层树模型。在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颜色
  1. 在移动的过程中或不移动时,若点击layerFirst时,颜色均会立马变化;
  2. 而在移动的过程中点击layerSecond时,则颜色不会变化,不移动的时才会变化。
上一篇下一篇

猜你喜欢

热点阅读