1、和视图一样,图层在"图层树"当中也是相对于父图层按层级关系放置,一个图层的position依赖于它父图层的bounds,如果父图层发生了移动,它的所有子图层也会跟着移动
2、有时候你需要知道一个图层的绝对位置,或者是相对于另一个图层的位置,而不是它当前父图层的位置,CALayer给不同坐标系之间的图层转换提供了一些工具类方法,这些方法可以把定义在一个图层坐标系下的点或者矩形转换成另一个图层坐标系下的点或者矩形
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
2、翻转的几何结构
- 1、常规来说,在iOS上,一个图层的position位于父图层的左上角,但是在Mac OS上,通常是位于在做下角。Core Animation可以通过geometryFlipped属性来适配这两种情况,它决定了一个图层的坐标是否相对于父图层垂直翻转,是一个Bool类型。
3、和UIView严格的二维坐标系不同,CALayer存在于一个三维空间当中。除了position和anchorPoint属性之外,CALayer还有另外两个属性,zposition和anchorPointZ,二者都是在Z轴上描述图层位置的浮点类型。
4、图层是根据它们子图层的sublayers出现的顺序来绘制的,这就是所谓的画家的算法--就像一个画家在墙上作画,后被绘制上的图层将会遮盖住之前的图层,但是通过设置图层的zPosition,来改变图层的层级关系
#import "ViewController.h"
@interface ViewController ()
/**
* 绿色View
*/
@property (nonatomic, strong) UIView *greenView;
/**
* 红色View
*/
@property (nonatomic, strong) UIView *redView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.greenView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
self.greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.greenView];
self.redView = [[UIView alloc] initWithFrame:CGRectMake(150, 150, 200, 200)];
self.redView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.redView];
}
@end
QQ20161222-0@2x.png
5、我们希望在真实的应用中也能显示出绘图的顺序,同样地,如果我们提高绿色视图的zPosition,我们会发现顺序就反了。其实并不需要增加太多,视图都非常地薄,所以给zPosition提高一个像素就可以让绿色视图前置,当然0.1或者0.0001也能够做到,但是最好不要这样,因为浮点类型四舍五入的计算可能造成一些不便的麻烦
#import "ViewController.h"
@interface ViewController ()
/**
* 绿色View
*/
@property (nonatomic, strong) UIView *greenView;
/**
* 红色View
*/
@property (nonatomic, strong) UIView *redView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.greenView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
self.greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.greenView];
self.redView = [[UIView alloc] initWithFrame:CGRectMake(150, 150, 200, 200)];
self.redView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.redView];
// 改变 绿色View的图层zPosition
self.greenView.layer.zPosition = 1.0;
// // 改变 红色View的图层zPosition
// self.redView.layer.zPosition = 1.0;
}
@end
效果如下:
QQ20161222-1@2x.png
小结
- 1、当图层的zPosition一样的时候,显示的层级顺序和View添加到视图的顺序相反
网友评论