2011-12-13 15 views
6

Tôi có một bộ sưu tập gồm CALayers. Mỗi lớp là lớp con của cùng một cha mẹ CALayer và mỗi lớp có một bóng được áp dụng cho nó. Các lớp được định vị động và có nhiều lớp, vì vậy tôi không thể dự đoán cách sắp xếp chúng sẽ được sắp xếp trước.Có cách nào để ngăn chặn bóng của CALayer khỏi các lớp lân cận chồng chéo không?

Nếu các lớp nằm cạnh nhau (đủ gần để chúng gần như chạm vào), bóng của một trong số CALayers được hiển thị trên đầu trang của CALayer khác. Đó có lẽ là hiệu ứng mong muốn trong hầu hết các trường hợp, nhưng tôi muốn các lớp của tôi tồn tại trong cùng một mặt phẳng z. (Một ví dụ về cách này là cách CSS3 đổ bóng được áp dụng để chặn các phần tử trong thiết kế web.)

Điều này có khả thi không? Làm thế nào tôi có thể đạt được điều này?

(Tôi đã có ý tưởng này: Thêm lớp con 'bóng' vào mỗi CALayer với hình ảnh bóng của riêng tôi và đặt vị trí z thành giá trị thấp hơn. Nhưng không phải lớp cây làm cho điều này không thể? vị trí trong hệ tọa độ của một lớp độc lập với vị trí z trong hệ tọa độ của một lớp khác, phải không?)

Trả lời

16

Nếu tất cả các lớp bóng có cùng thiết lập bóng, đặt chúng vào một lớp chứa và đặt bóng trên vùng chứa lớp. Ví dụ:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CALayer *containerLayer = [CALayer layer]; 
    containerLayer.frame = self.view.bounds; 
    containerLayer.shadowRadius = 10; 
    containerLayer.shadowOpacity = 1; 
    [self.view.layer addSublayer:containerLayer]; 

    CAShapeLayer *layer1 = [CAShapeLayer layer]; 
    layer1.bounds = CGRectMake(0, 0, 200, 200); 
    layer1.position = CGPointMake(130, 130); 
    layer1.path = [UIBezierPath bezierPathWithOvalInRect:layer1.bounds].CGPath; 
    layer1.fillColor = [UIColor redColor].CGColor; 
    [containerLayer addSublayer:layer1]; 

    CAShapeLayer *layer2 = [CAShapeLayer layer]; 
    layer2.bounds = CGRectMake(0, 0, 200, 200); 
    layer2.position = CGPointMake(170, 200); 
    layer2.path = [UIBezierPath bezierPathWithOvalInRect:layer2.bounds].CGPath; 
    layer2.fillColor = [UIColor blueColor].CGColor; 
    [containerLayer addSublayer:layer2]; 
} 

Output:

overlapping circles with unified shadow

+0

Wow, cảm ơn bạn! Điều này là rất rõ ràng trong hindsight. Ý tưởng đã xảy ra với tôi, nhưng tôi nghĩ rằng nó sẽ áp dụng một cái bóng cho hình dạng của tầng container (dù đó là gì, haha). –

+1

+1 Câu trả lời xuất sắc – occulus

Các vấn đề liên quan