Được biết, zPosition
của các lớp chỉ xác định lớp nào che phủ lớp nào. Cho dù đó là zPosition
của 10 hoặc 1000 sẽ không ảnh hưởng đến vị trí của nó.Trên iOS, tại sao cài đặt sublayerTransform của lớp tự biến thành hành động như CATranformLayer?
Tức là, trừ khi chúng tôi use CATransformLayer
to contain those layers thì zPosition
của các lớp đó sẽ ảnh hưởng đến vị trí của lớp.
Tuy nhiên, mã sau chạy trong iOS 5.1.1 làm cho zPosition
thay đổi vị trí của các lớp ... bạn có thể dùng thử trong Ứng dụng chế độ xem đơn mới và thêm mã sau vào ViewController.m
. Nếu zPosition
của layer2
được thay đổi từ 88
thành 188
, chúng ta có thể thấy rằng lớp di chuyển cho phù hợp. Vì vậy, không có CATransformLayer
có trong mã; tại sao nó sẽ hành xử như thế? (Vui lòng trích dẫn tài liệu của Apple hoặc bất kỳ tài liệu tham khảo nào).
Cũng liên quan là, nếu dòng self.view.layer.sublayerTransform = transform3D;
được đổi thành self.view.layer.transform = transform3D;
thì zPosition
sẽ không ảnh hưởng đến vị trí. Nhưng according to the Apple docs, transform
and sublayerTransform
only differ in whether self is transformed or not:
Hai thuộc tính lớp chỉ định chuyển đổi ma trận:
transform
vàsublayerTransform
. Ma trận được chỉ định bởitransform property
là được áp dụng cho lớp và lớp con của lớp tương ứng với lớpanchorPoint
. [...] Ma trận được chỉ định bởi thuộc tínhsublayerTransform
chỉ được áp dụng cho các lớp con của lớp, thay vì cho lớp đó.
Vì vậy, điều lạ lùng là lý do tại sao việc thay đổi sẽ gây ra self.view.layer
hoạt động như CATransformLayer
.
-(void) viewDidAppear:(BOOL)animated {
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = -1.0/1000;
transform3D = CATransform3DRotate(transform3D, M_PI/4, 0, 1, 0);
self.view.layer.sublayerTransform = transform3D;
CALayer *layer1 = [[CALayer alloc] init];
layer1.zPosition = 33;
layer1.frame = CGRectMake(100, 100, 100, 100);
layer1.backgroundColor = [[UIColor orangeColor] CGColor];
[self.view.layer addSublayer:layer1];
CALayer *layer2 = [[CALayer alloc] init];
layer2.zPosition = 88;
layer2.frame = CGRectMake(100, 120, 100, 100);
layer2.backgroundColor = [[UIColor yellowColor] CGColor];
[self.view.layer addSublayer:layer2];
}