2013-07-11 37 views
10

Tôi đang thử nghiệm với iOS SDK và tôi có UIView cấu trúc sau:Moving mặt nạ CALayer về cuộn trong một scrollview

  • UIView
    • UIImageView - chỉ là một hình nền
    • UIImageView (với một CALayer mặt nạ)
    • UIScrollView
      • Label

cấu Rất đơn giản, UIScrollView là lớp trong suốt và thứ hai UIImageView có một mặt nạ trên đó. Những gì tôi đang cố gắng làm là mặt nạ CALayer sẽ di chuyển vị trí của nó theo vị trí của Nội dung trong chế độ xem cuộn. Nếu người dùng cuộn, vị trí của mặt nạ sẽ được cập nhật. Tôi đã giải quyết vấn đề này bằng cách sử dụng UIScrollView 's đại biểu:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGPoint contentOffset = scrollView.contentOffset; 
    contentOffset.y = -contentOffset.y; 

    self.overlayImageView.viewlayer.mask.position = contentOffset; 
} 

Mask được tạo ra trong viewDidLoad và không thay đổi trong suốt vòng đời view controller của.

Vấn đề là vị trí mặt nạ đang cập nhật quá chậm. Bằng cách đó, có vẻ mặt nạ đang theo dõi nội dung của chế độ xem cuộn, chứ không phải cuộn với nó. Phương thức ủy nhiệm scrollViewDidScroll được gọi chính xác.

Để bạn hiểu rõ hơn về sự cố, tôi sẽ đính kèm video mà tôi đã tạo trong trình mô phỏng iOS. http://www.youtube.com/watch?v=w3xRl3LTngY

Vì vậy, câu hỏi là:

Có cách nào để làm cho mặt nạ cập nhật nhanh hơn hay đây là giới hạn của iOS?

Trả lời

16

CALayer là ngầm hoạt hình đối với một số tài sản như vị trí cố gắng vô hiệu hóa chúng:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 

[CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
CGPoint contentOffset = scrollView.contentOffset; 
contentOffset.y = -contentOffset.y; 

self.overlayImageView.viewlayer.mask.position = contentOffset; 
[CATransaction commit]; 

} 
+1

Tuyệt vời, sửa chữa vấn đề. Cảm ơn nhiều. Thay đổi vị trí mặt nạ bây giờ là nhiều chất lỏng hơn. – Legoless