特性自动测算而生的。属性自动计算而有底。

属性自动计算而出的,属性自动计算而出的

CAScrollLayer

对于一个不更换的图层,它的bounds和它的frame举凡平等的,frame性是由于bounds特性自动测算而发出底,所以更改任意一个价都见面更新任何价值。

然若您独自想展示一个大图层里面的一律略带部分也。比如说,你或许来一个怪死之图片,你希望用户会轻易滑动,或者是一个数码或者文本的丰富列表。在一个卓越的iOS应用中,你可能会见为此到UITableView或是UIScrollView,但是于单身的图层来说,什么会等价于刚刚提到的UITableViewUIScrollView呢?

以亚段中,我们探索了图层的contentsRect性之用法,它实在是能解决在图层中小地方显得大图片的缓解智。但是如果你的图层包含子图层那她就非是一个老好之解决方案,因为,这样做的语每次你想『滑动』可张区域的时光,你就算需要手工重新计算并创新具有的子图层位置。

以此上就待CAScrollLayer了。CAScrollLayer有一个-scrollToPoint:艺术,它自动适应bounds的原点以便图层内容出现于滑的地方。注意,这虽是她做的具有事务。前面提到了,Core
Animation并无处理用户输入,所以CAScrollLayer并无承担将触摸事件转换为滑行事件,既非渲染滚动条,也无落实其他iOS指定行为像滑动反弹(当视图滑动超多矣她的分界的拿会反弹回是的地方)。

让咱们来用CAScrollLayer来大一个中坚的UIScrollView替代品。我们以见面因此CAScrollLayer当视图的宿主图层,并创建一个自定义的UIView,然后用UIPanGestureRecognizer贯彻触摸事件响应。这段代码见清单6.10.
图6.11是运行效果:ScrollView来得了一个超出它的frameUIImageView

清单6.10 用CAScrollLayer贯彻滑动视图

 

澳门永利234555com 1澳门永利234555com 2

 1 #import "ScrollView.h"
 2 #import  @implementation ScrollView
 3 + (Class)layerClass
 4 {
 5     return [CAScrollLayer class];
 6 }
 7 
 8 - (void)setUp
 9 {
10     //enable clipping
11     self.layer.masksToBounds = YES;
12 
13     //attach pan gesture recognizer
14     UIPanGestureRecognizer *recognizer = nil;
15     recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
16     [self addGestureRecognizer:recognizer];
17 }
18 
19 - (id)initWithFrame:(CGRect)frame
20 {
21     //this is called when view is created in code
22     if ((self = [super initWithFrame:frame])) {
23         [self setUp];
24     }
25     return self;
26 }
27 
28 - (void)awakeFromNib {
29     //this is called when view is created from a nib
30     [self setUp];
31 }
32 
33 - (void)pan:(UIPanGestureRecognizer *)recognizer
34 {
35     //get the offset by subtracting the pan gesture
36     //translation from the current bounds origin
37     CGPoint offset = self.bounds.origin;
38     offset.x -= [recognizer translationInView:self].x;
39     offset.y -= [recognizer translationInView:self].y;
40 
41     //scroll the layer
42     [(CAScrollLayer *)self.layer scrollToPoint:offset];
43 
44     //reset the pan gesture translation
45     [recognizer setTranslation:CGPointZero inView:self];
46 }
47 @end

View Code

图6.11 用UIScrollView开创一个集聚的滑行视图

不同于UIScrollView,我们定制的滑行视图类并无落实其他形式的鄂检查(bounds
checking)。图层内容最生或滑发生视图的分界并不过滑下去。CAScrollLayer并不曾一样于UIScrollViewcontentSize的属性,所以当CAScrollLayer滑的时了无一个大局的但是滑动区域的概念,也无力回天从适应它的界限原点至而指定的价。它用不可知于适应边界大小是盖其不待,内容全好过界限。

这就是说您必会意外用CAScrollLayer的含义究竟哪,因为你可以简单地用一个惯常的CALayer下一场手动适应边界原点啊。真相其实并无复杂,UIScrollView并没因此CAScrollLayer,事实上,就是简的经直接操作图层边界来促成滑动。

CAScrollLayer出一个秘密的发因此特色。如果你查看CAScrollLayer的峰文件,你尽管见面注意到闹一个扩展分类实现了一部分术与总体性:

1 - (void)scrollPoint:(CGPoint)p;
2 - (void)scrollRectToVisible:(CGRect)r;
3 @property(readonly) CGRect visibleRect;

 

顾这些方法以及属性名,你也许会认为这些点子让每个CALayer实例增加了滑动功能。但是事实上他们只是放置在CAScrollLayer饱受之图层的实用方法。scrollPoint:艺术从图层树被搜索并找到第一只可用之CAScrollLayer,然后滑动它叫指定点成可视的。scrollRectToVisible:法实现了一如既往的作业只不过是图在一个矩形上的。visibleRect属性决定图层(如果有的话)的哇部分凡当下之可视区域。如果您自己实现这些点子就是见面相对好掌握某些,但是CAScrollLayer拉您看了这些麻烦,所以当提到到落实图层滑动的下即便好据此上了。

 

CAScrollLayer

于一个免移的图层,它的bounds和它的frame是如出一辙的,frame属性是由于bounds性自动测算而发底,所以更改任意一个价值都见面更新任何价值。

而是如果您只想展示一个大图层里面的平等稍稍一些为。比如说,你也许发一个充分充分的图形,你要用户会自由滑动,或者是一个数量要文本的增长列表。在一个杰出的iOS应用中,你或会见因此到UITableView或是UIScrollView,但是于单身的图层来说,什么会等价于刚刚提到的UITableViewUIScrollView呢?

于次节中,我们探索了图层的contentsRect性能的用法,它真的是力所能及缓解在图层中小地方显得大图片的化解办法。但是要你的图层包含子图层那它们就不是一个分外好之缓解方案,因为,这样做的口舌每次你想『滑动』可看区域之早晚,你便待手工重新计算并创新具有的子图层位置。

斯时节就是用CAScrollLayer了。CAScrollLayer有一个-scrollToPoint:方,它自动适应bounds的原点以便图层内容出现在滑行的地方。注意,这就是是它举行的备业务。前面提到了,Core
Animation并无处理用户输入,所以CAScrollLayer并无顶用触摸事件转换为滑行事件,既未渲染滚动条,也非落实任何iOS指定行为像滑动反弹(当视图滑动超多矣它的界线的用会见反弹回是的地方)。

深受咱们来为此CAScrollLayer来广大一个主导的UIScrollView替代品。我们拿会为此CAScrollLayer用作视图的宿主图层,并创一个自定义的UIView,然后用UIPanGestureRecognizer兑现触摸事件响应。这段代码见清单6.10.
图6.11是运行效果:ScrollView显了一个浮它的frameUIImageView

清单6.10 用CAScrollLayer兑现滑动视图

 

澳门永利234555com 3澳门永利234555com 4

 1 #import "ScrollView.h"
 2 #import  @implementation ScrollView
 3 + (Class)layerClass
 4 {
 5     return [CAScrollLayer class];
 6 }
 7 
 8 - (void)setUp
 9 {
10     //enable clipping
11     self.layer.masksToBounds = YES;
12 
13     //attach pan gesture recognizer
14     UIPanGestureRecognizer *recognizer = nil;
15     recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
16     [self addGestureRecognizer:recognizer];
17 }
18 
19 - (id)initWithFrame:(CGRect)frame
20 {
21     //this is called when view is created in code
22     if ((self = [super initWithFrame:frame])) {
23         [self setUp];
24     }
25     return self;
26 }
27 
28 - (void)awakeFromNib {
29     //this is called when view is created from a nib
30     [self setUp];
31 }
32 
33 - (void)pan:(UIPanGestureRecognizer *)recognizer
34 {
35     //get the offset by subtracting the pan gesture
36     //translation from the current bounds origin
37     CGPoint offset = self.bounds.origin;
38     offset.x -= [recognizer translationInView:self].x;
39     offset.y -= [recognizer translationInView:self].y;
40 
41     //scroll the layer
42     [(CAScrollLayer *)self.layer scrollToPoint:offset];
43 
44     //reset the pan gesture translation
45     [recognizer setTranslation:CGPointZero inView:self];
46 }
47 @end

View Code

图6.11 用UIScrollView创立一个聚的滑动视图

不同于UIScrollView,我们定制的滑动视图类并没有兑现其他款式之边界检查(bounds
checking)。图层内容尽生或滑发生视图的界线并极滑下来。CAScrollLayer并没有同于UIScrollViewcontentSize的属性,所以当CAScrollLayer滑的时光了没有一个大局的但滑动区域之概念,也无从从适应它的分界原点至而指定的价值。它用未克自适应边界大小是以她不需,内容全好跨界限。

这就是说若早晚会意外用CAScrollLayer的义究竟哪,因为若可概括地用一个通常的CALayer接下来手动适应边界原点啊。真相其实并无复杂,UIScrollView并不曾就此CAScrollLayer,事实上,就是简的经过直接操作图层边界来贯彻滑动。

CAScrollLayer生一个隐秘的起因此特色澳门永利234555com。如果你翻CAScrollLayer的头文件,你虽会专注到产生一个恢宏分类实现了有的道以及特性:

1 - (void)scrollPoint:(CGPoint)p;
2 - (void)scrollRectToVisible:(CGRect)r;
3 @property(readonly) CGRect visibleRect;

 

看到这些措施与属性名,你可能会看这些方式给每个CALayer实例增加了滑动功能。但是实际他们只是放置在CAScrollLayer遭逢之图层的实用方法。scrollPoint:主意从图层树被追寻并找到第一个可用之CAScrollLayer,然后滑动它使指定点改为可视的。scrollRectToVisible:措施实现了扳平的事体只不过是作用在一个矩形上的。visibleRect特性决定图层(如果在的话)的呐部分凡是当前的可视区域。如果您自己实现这些方式就是见面相对好理解某些,但是CAScrollLayer扶您看看了这些劳动,所以当提到到贯彻图层滑动的时便得就此上了。