表现与模型(隐式动画),显示模型动画

突显与模型

CALayer的质量行为实在很不健康,因为改动二个图层的习性并从未当即见效,而是经过一段时间渐更改新。那是怎么实现的吗?

当你更改叁个图层的品质,属性值的确是立时更新的(借使你读取它的数据,你会意识它的值在您设置它的那一刻就已经生效了),不过荧屏上并不曾即时爆发转移。那是因为您设置的属性并从未直接调治图层的外观,相反,他只是概念了图层动画甘休之后将要变化的外观。

当设置CALayer的性质,实际上是在概念当前工作截至之后图层怎么着体现的模型。Core
Animation扮演了二个控制器的剧中人物,何况肩负依照图层行为和业务设置去不断更新视图的那些属性在显示屏上的景色。

我们商量的正是七个杰出的微型MVC模式CALayer是贰个连接用户分界面(正是MVC中的view)设想的类,不过在分界面本人这么些场馆下,CALayer的表现更疑似存款和储蓄了视图怎么样浮现和动画片的数据模型。实际上,在苹果本人的文书档案中,图层树日常都以值的图层树模型。

在iOS中,显示屏每分钟重绘伍十七次。假若动画时长比60分之一秒要长,Core
Animation就必要在设置壹次新值和新值生效之间,对荧屏上的图层实行重新协会。那表示CALayer除开“真实”值(正是您设置的值)之外,必要求懂妥善前显示在显示器上的属性值的记录。

种种图层属性的呈现实价值都被储存在四个名称为表现图层的独自图层个中,他得以因而-presentationLayer办法来做客。这一个显示图层实际上是模型图层的复制,但是它的属性值代表了在其余指按期刻当前外观效果。换句话说,你能够透过展现图层的值来收获当前荧屏上的确展现出来的值(图7.4)。

作者们在首先章中提到除了图层树,另外还大概有呈现树。呈现树通过图层树中持有图层的显现图层所造成。注意表现图层仅仅当图层首次被提交(就是第3回第二次在显示器上出示)的时候成立,所以在那在此之前调用-presentationLayer将会回去nil

你只怕注意到有三个叫作–modelLayer的办法。在表现图层上调用–modelLayer将会回来它正值显现所重视的CALayer。平常在二个图层上调用-modelLayer会返回–self(实际上我们早就创办的原始图层就是一种数据模型)。

图片 1

图7.4 叁个运动的图层是什么通过数据模型展现的

大好多情状下,你无需直接待上访谈呈现图层,你可以因此和模型图层的相互,来让Core
Animation更新彰显。三种情形下显现图层会变得很有用,一个是一齐动画,一个是拍卖用户交互。

  • 设若您在促成贰个基于电火花计时器的动画片(见第11章“基于停车计时器的动画片”),而不光是依照事务的卡通,那一年正确地领略在某有时刻图层彰显在哪些岗位就能对科学摆放图层很有用了。
  • 举例您想让您做动画的图层响应用户输入,你可以使用-hitTest:办法(见第三章“图层几何学”)来判定钦点图层是不是被触动,那时候对呈现图层并不是模型图层调用-hitTest:会来得更有意义,因为表现图层代表了用户眼下观看的图层地方,并非日前卡通甘休现在的地点。

大家得以用一个简易的案例来证实前面一个(见清单7.7)。在那么些事例中,点击显示屏上的任性地方将会让图层平移到这里。点击图层本身能够自由改动它的颜色。大家经过对表现图层调用-hitTest:来决断是还是不是被点击。

假设改变代码让-hitTest:直白作用于colorLayer并不是显示图层,你会发觉当图层移动的时候它并不可能科学展现。那时候你就需求点击图层就要移动到的岗位并非图层本身来响应点击(那就是干什么用呈现图层来响应交互的因由)。

清单7.7 使用presentationLayer图层来判断当前图层地方

图片 2图片 3

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, strong) CALayer *colorLayer;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad
10 {
11     [super viewDidLoad];
12     //create a red layer
13     self.colorLayer = [CALayer layer];
14     self.colorLayer.frame = CGRectMake(0, 0, 100, 100);
15     self.colorLayer.position = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
16     self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
17     [self.view.layer addSublayer:self.colorLayer];
18 }
19 
20 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
21 {
22     //get the touch point
23     CGPoint point = [[touches anyObject] locationInView:self.view];
24     //check if we've tapped the moving layer
25     if ([self.colorLayer.presentationLayer hitTest:point]) {
26         //randomize the layer background color
27         CGFloat red = arc4random() / (CGFloat)INT_MAX;
28         CGFloat green = arc4random() / (CGFloat)INT_MAX;
29         CGFloat blue = arc4random() / (CGFloat)INT_MAX;
30         self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
31     } else {
32         //otherwise (slowly) move the layer to new position
33         [CATransaction begin];
34         [CATransaction setAnimationDuration:4.0];
35         self.colorLayer.position = point;
36         [CATransaction commit];
37     }
38 }
39 @end
40 
41  

View Code

 

表现与模型

CALayer的质量行为其实很不正常,因为改变三个图层的习性并不曾应声见效,而是通过一段时间渐更动新。那是怎么办到的啊?

当你改造叁个图层的品质,属性值的确是当下更新的(要是你读取它的数目,你会发掘它的值在您设置它的那一刻就早已生效了),可是显示屏上并未马上爆发改造。那是因为您设置的属性并不曾直接调节图层的外观,相反,他只是概念了图层动画甘休之后将要变化的外观。

当设置CALayer的品质,实际上是在概念当前业务结束未来图层如何展现的模型。Core
Animation扮演了一个控制器的角色,并且负担依照图层行为和作业设置去不断更新视图的这几个属性在显示器上的景色。

作者们探讨的就是三个卓绝的微型MVC模式CALayer是三个连连用户分界面(便是MVC中的view)虚拟的类,不过在分界面自身那些情形下,CALayer的表现更疑似存款和储蓄了视图如何展现和动画片的数据模型。实际上,在苹果本人的文档中,图层树经常都以值的图层树模型。

在iOS中,荧屏每秒钟重绘五十八遍。倘使动画时间长度比60分之一秒要长,Core
Animation就供给在安装叁遍新值和新值生效之间,对显示屏上的图层进行重新社团。那意味着CALayer除开“真实”值(就是您设置的值)之外,必须求懂妥当前显示在显示器上的属性值的笔录。

每种图层属性的体现实价值都被积累在八个誉为表现图层的单身图层当中,他能够通过-presentationLayer办法来寻访。这些凸显图层实际上是模型图层的复制,但是它的属性值代表了在任何指按期刻当前外观效果。换句话说,你能够由此彰显图层的值来收获当前显示器上确实显示出来的值(图7.4)。

咱俩在首先章中涉及除了图层树,其余还也是有呈现树。显示树通过图层树中持有图层的变现图层所产生。注意表现图层仅仅当图层第一遍被提交(正是第二次第2回在显示屏上彰显)的时候创设,所以在那以前调用-presentationLayer将会回到nil

你或者注意到有一个名字为–modelLayer的章程。在表现图层上调用–modelLayer将会回来它正值突显所依赖的CALayer。经常在三个图层上调用-modelLayer会返回–self(实际上我们早就创办的原始图层就是一种数据模型)。

图片 1

图7.4 二个运动的图层是何等通过数据模型显示的

大多数气象下,你没有须求一直访谈呈现图层,你能够因而和模型图层的相互,来让Core
Animation更新呈现。两种情景下表现图层会变得很有用,二个是一道动画,叁个是拍卖用户交互。

  • 要是您在促成三个依据电火花计时器的动画片(见第11章“基于机械漏刻的卡通”),而不光是依照事务的卡通,那一年准确地领略在某一天天图层呈现在哪些岗位就能对科学摆放图层很有用了。
  • 借使您想让您做动画的图层响应用户输入,你能够使用-hitTest:办法(见第三章“图层几何学”)来决断钦点图层是还是不是被触动,那时候对呈现图层并非模型图层调用-hitTest:会来得更有意义,因为表现图层代表了用户前段时间观望的图层地点,并不是眼下卡通甘休未来的职位。

大家得以用二个简约的案例来证实前者(见清单7.7)。在这么些事例中,点击显示器上的大三个人置将会让图层平移到那边。点击图层自个儿能够大肆改造它的颜料。我们经过对表现图层调用-hitTest:来剖断是不是被点击。

倘诺退换代码让-hitTest:直白功能于colorLayer实际不是展现图层,你会发觉当图层移动的时候它并不能够科学显示。那时候你就需求点击图层就要移动到的岗位并非图层本人来响应点击(那正是怎么用展现图层来响应交互的来头)。

清单7.7 使用presentationLayer图层来决断当前图层地点

图片 5图片 6

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, strong) CALayer *colorLayer;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad
10 {
11     [super viewDidLoad];
12     //create a red layer
13     self.colorLayer = [CALayer layer];
14     self.colorLayer.frame = CGRectMake(0, 0, 100, 100);
15     self.colorLayer.position = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
16     self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
17     [self.view.layer addSublayer:self.colorLayer];
18 }
19 
20 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
21 {
22     //get the touch point
23     CGPoint point = [[touches anyObject] locationInView:self.view];
24     //check if we've tapped the moving layer
25     if ([self.colorLayer.presentationLayer hitTest:point]) {
26         //randomize the layer background color
27         CGFloat red = arc4random() / (CGFloat)INT_MAX;
28         CGFloat green = arc4random() / (CGFloat)INT_MAX;
29         CGFloat blue = arc4random() / (CGFloat)INT_MAX;
30         self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
31     } else {
32         //otherwise (slowly) move the layer to new position
33         [CATransaction begin];
34         [CATransaction setAnimationDuration:4.0];
35         self.colorLayer.position = point;
36         [CATransaction commit];
37     }
38 }
39 @end
40 
41  

View Code

 

应用presentationLayer图层来剖断当前图层地方的代码:

<pre>import UIKit

class ViewController: UIViewController {

var colorLayer: CALayer!

override func viewDidLoad() {
    super.viewDidLoad()

    self.initView()
}

func initView()
{
    self.colorLayer = CALayer()
    self.colorLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
    self.colorLayer.position = CGPoint(x: self.view.bounds.size.width / 2, y: self.view.bounds.size.height / 2)
    self.colorLayer.backgroundColor = UIColor.blue.cgColor
    self.view.layer.addSublayer(self.colorLayer)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
    let touch = touches.first
    let point = touch?.location(in: self.view)

    if ((self.colorLayer.presentation()?.hitTest(point!)) != nil)
    {
        let red = arc4random() % 256
        let green = arc4random() % 256
        let blue = arc4random() % 256

        self.colorLayer.backgroundColor = UIColor(red: CGFloat(red) / 255, green: CGFloat(green) / 255, blue: CGFloat(blue) / 255, alpha: 1).cgColor
    }else
    {
        CATransaction.begin()
        CATransaction.setAnimationDuration(4)
        self.colorLayer.position = point!
        CATransaction.commit()
    }
}

}

</pre>

图片 7

效果图.gif

展现与模型

CALayer的习性行为其实很不符合规律,因为退换贰个图层的天性并不曾马上见效,而是经过一段时间渐改变新。那是怎么完毕的吧?

当您转移三个图层的性质,属性值的确是马上更新的(假若您读取它的多少,你会意识它的值在你设置它的那一刻就早就生效了),但是显示器上并未应声发生改动。那是因为你设置的性质并从未一直调度图层的外观,相反,他只是概念了图层动画停止今后将在变化的外观。

当设置CALayer的习性,实际上是在概念当前职业甘休未来图层怎样体现的模型。Core
Animation扮演了贰个控制器的剧中人物,况兼担任依照图层行为和事务设置去不断更新视图的那几个属性在荧屏上的情事。

咱俩谈谈的正是多少个超人的微型MVC模式CALayer是三个一而再用户分界面(便是MVC中的view)设想的类,不过在分界面本人那几个场景下,CALayer的行事更疑似存款和储蓄了视图如何体现和卡通的数据模型。实际上,在苹果自个儿的文书档案中,图层树平时都是值的图层树模型。

在iOS中,显示屏每秒钟重绘57回。假使动画时间长度比60分之一秒要长,Core
Animation就供给在装置一次新值和新值生效之间,对显示屏上的图层举行重复组织。那象征CALayer除此而外“真实”值(就是你设置的值)之外,须要求懂妥当前显示在显示屏上的属性值的笔录。

各个图层属性的展现值都被存放在三个名字为展现图层的单独图层在那之中,他能够通过-presentationLayer方法来访谈。那几个突显图层实际上是模型图层的复制,可是它的属性值代表了在其余指定期刻当前外观效果。换句话说,你能够由此展现图层的值来获取当前荧屏上真正展现出来的值(图7.4)。

大家在第一章中涉及除了图层树,别的还大概有呈现树。呈现树通过图层树中存有图层的表现图层所变成。注意展现图层仅仅当图层第三遍被提交(就是第一回第一遍在显示器上显得)的时候成立,所以在那此前调用-presentationLayer将会重临nil

您大概注意到有四个叫作–modelLayer的点子。在显示图层上调用–modelLayer将会回去它正在显现所注重的CALayer。经常在贰个图层上调用-modelLayer会返回–self(实际上大家早已创办的原始图层正是一种数据模型)。

图片 1

图7.4 二个活动的图层是什么通过数据模型展现的

大部意况下,你无需直接访问展现图层,你能够通过和模型图层的并行,来让Core
Animation更新显示。三种意况下显现图层会变得很有用,三个是同步动画,三个是处理用户交互。

  • 倘诺你在贯彻贰个基于定时器的卡通(见第11章“基于电磁关照计时器的动画”),而不只是基于事务的卡通片,今年准确地掌握在某一随时图层展现在什么地方就能够对科学摆放图层很有用了。
  • 万一你想让您做动画的图层响应用户输入,你能够动用-hitTest:方法(见第三章“图层几何学”)来决断内定图层是还是不是被触动,那时候对呈现图层并非模型图层调用-hitTest:会议及展览示更有意义,因为显示图层代表了用户眼下看来的图层地点,并非现阶段动画结束现在的岗位。

作者们能够用一个简便的案例来注脚前面一个(见清单7.7)。在这些例子中,点击显示屏上的率性地方将会让图层平移到那边。点击图层本身能够随便改造它的颜料。大家透过对展现图层调用-hitTest:来决断是不是被点击。

假若改换代码让-hitTest:一贯效果于colorLayer并非显现图层,你会意识当图层移动的时候它并不可能正确显示。那时候你就供给点击图层将在移动到的职分并非图层本人来响应点击(那就是干吗用显示图层来响应交互的因由)。

清单7.7 使用presentationLayer图层来判别当前图层地方

图片 9

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, strong) CALayer *colorLayer;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad
10 {
11     [super viewDidLoad];
12     //create a red layer
13     self.colorLayer = [CALayer layer];
14     self.colorLayer.frame = CGRectMake(0, 0, 100, 100);
15     self.colorLayer.position = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
16     self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
17     [self.view.layer addSublayer:self.colorLayer];
18 }
19 
20 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
21 {
22     //get the touch point
23     CGPoint point = [[touches anyObject] locationInView:self.view];
24     //check if we've tapped the moving layer
25     if ([self.colorLayer.presentationLayer hitTest:point]) {
26         //randomize the layer background color
27         CGFloat red = arc4random() / (CGFloat)INT_MAX;
28         CGFloat green = arc4random() / (CGFloat)INT_MAX;
29         CGFloat blue = arc4random() / (CGFloat)INT_MAX;
30         self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
31     } else {
32         //otherwise (slowly) move the layer to new position
33         [CATransaction begin];
34         [CATransaction setAnimationDuration:4.0];
35         self.colorLayer.position = point;
36         [CATransaction commit];
37     }
38 }
39 @end
40 
41  

View Code

 

彰显与模型
CALayer
的品质行为其实很不健康,因为改换贰个图层的性质并不曾马上见效,而是经过一…

活动的图层是如何通过数据模型展现的.png

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注