2012-06-06 25 views
7

Đượ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: transformsublayerTransform. Ma trận được chỉ định bởi transform property là được áp dụng cho lớp và lớp con của lớp tương ứng với lớp anchorPoint. [...] Ma trận được chỉ định bởi thuộc tính sublayerTransform 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];  

} 

Trả lời

0

chúng ta có thể nghĩ rằng lớp như là một lớp phối hợp, khi chúng ta tạo một layer transfrom3D, nó phối hợp trở thành 3D, nhưng lớp con của nó vẫn hiển thị như 2D, nhưng khi thiết lập lớp con transfrom3D, lớp sẽ làm cho nó tất cả các lớp con hiển thị dưới dạng 3D.it giống như xoay vòng

1

Để thực sự hiểu sự khác biệt giữa một lớp transformsublayerTransform thuộc tính, tôi nghĩ rằng điều này hữu ích khi nghĩ đến điều này khi xem TV có nội dung 3D trong đó. Kiểm tra my modified version of your code in Swift playground.

Đây là phiên bản bắt đầu: bạn có TV có nội dung không có chuyển đổi phối cảnh nào. Do đó, nội dung của bạn (hai lớp con màu cam và màu vàng) trông phẳng ngay cả khi xoay quanh trục y. Khá nhiều những gì bạn mong đợi cho một phép chiếu chính tả.

.none option

Tuy nhiên, nếu bạn giữ TV của bạn vẫn còn, nhưng chuyển đổi nội dung của bạn bên dưới với chiếu phối cảnh, bây giờ bạn ngay lập tức nhìn thấy chiều sâu của nội dung của bạn. zPosition của các lớp con bạn đã thêm thực sự đóng một vai trò quan trọng trong việc cung cấp cho bạn cảm giác về chiều sâu và nó đúng là như vậy bởi its definition. Đây chính xác là cách hoạt động của sublayerTransform: chỉ chuyển đổi nội dung chứ không phải chính TV.

.sublayerTransform option

Bây giờ, những gì nó sẽ như thế nào nếu tôi sử dụng transform thay vì sublayerTranform? Hãy tưởng tượng không chuyển chỉ nội dung, nhưng xoay toàn bộ TV cùng với các nội dung gắn liền với màn hình, và bạn sẽ thấy kết quả mong đợi:

.transform option

Vì vậy, yeah, rõ ràng transformsublayerTransform cư xử khá khác khi nói đến việc xử lý zPosition của các lớp con, mặc dù the documentation doesn't explicitly say so. zPosition của lớp con không ảnh hưởng đến số transform của phụ huynh, nhưng cung cấp hiệu ứng 3D thông thường trên số sublayerTransform của phụ huynh.