2010-02-15 31 views
10

Tôi đang tạo công tắc bật/tắt tùy chỉnh cho iPhone (tương tự như công tắc chuẩn) và tôi đang ở vị trí mà tôi đang đặt mặt nạ của thanh trượt, nhưng gọi [[myView layer] setMask:maskLayer] thiết lập vị trí của lớp mặt nạ liên quan đến lớp mà nó là mặt nạ, không liên quan đến tầng chứa của lớp mặt nạ. Đối với kịch bản cụ thể này, vị trí của lớp mặt nạ cần phải được đặt tương đối so với lớp chứa vì thanh trượt chuyển đổi sẽ di chuyển bên dưới mặt nạ và mặt nạ sẽ giữ nguyên.Masking a CALayer - iPhone

Không cần phải làm sống động mặt nạ và thanh trượt chuyển đổi thành phần để đạt được hiệu quả mong muốn, bất cứ ai biết cách thực hiện công việc này? Đây là những gì tôi đã có cho đến nay:

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
CGMutablePathRef path = CGPathCreateMutable(); 

CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, 13, 13)); 
CGPathAddEllipseInRect(path, nil, CGRectMake(30, 0, 13, 13)); 
CGPathAddRect(path, nil, CGRectMake(6, 0, 32, 13)); 

[maskLayer setPath:path]; 
[maskLayer setFillColor:[[UIColor greenColor] CGColor]]; 

[[self layer] addSublayer:maskLayer]; 

[maskLayer setPosition:CGPointMake(2, 2)]; 

[self addSubview:toggleView]; 

[[toggleView layer] setMask:maskLayer]; 
+0

Nếu mã này không sử dụng ARC, 'đường dẫn' bị rò rỉ. – titaniumdecoy

Trả lời

14

Mặt nạ chỉ là lớp đặc biệt của lớp phủ, vì vậy lớp phủ mặt nạ sẽ luôn là lớp mặt nạ. Không có cách nào xung quanh nó. Ngoài ra, bạn vi phạm cảnh báo này trong tài liệu:

Khi đặt mặt nạ cho lớp mới, lớp siêu lớp mới phải được đặt thành 0, nếu không hành vi không được xác định.

Bạn nên xóa dòng [[self layer] addSublayer:maskLayer];.

Để giải quyết vấn đề của bạn, tôi sẽ tạo một lớp hoặc chế độ xem khác có chứa mọi thứ hiện có trên toggleView của bạn và sau đó thêm lớp đó vào toggleLayer của bạn dưới dạng lớp con. Bằng cách đó, bạn có thể định vị lớp con mới độc lập với mặt nạ và nếu bạn di chuyển lớp cha, cả mặt nạ và lớp con sẽ di chuyển cùng nhau (đó là những gì chúng nên làm nếu tôi hiểu chính xác).

+0

Thật tuyệt, tôi nghĩ tôi thấy những gì bạn nói, và nó có ý nghĩa hơn để làm theo cách đó. Cảm ơn! – jtrim

+4

Tôi vừa triển khai giải pháp này và nó hoạt động tuyệt vời! :: http://gist.github.com/306792 – jtrim

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