2012-06-18 18 views
9

Tôi có chế độ xem có hỗ trợ CATiledLayer. Tôi muốn lấy các khối có thể nhìn thấy từ CATILLayer UIView này và thêm nó vào một khung nhìn khác như là lớp đệm CALayer, do đó tái tạo hình ảnh hiển thị trong một UIView khác mà không sử dụng CATiledLayer.CATiledLayer to CALayer

Lý do tôi muốn làm điều này là tôi sẽ sử dụng UIView thứ hai này để che giấu hiệu quả của việc cập nhật CATIVLayer được hỗ trợ UIView - điều này hiện đang tạo nhấp nháy vì tất cả các ô được tải lại.

Vấn đề là, tôi không hoàn toàn chắc chắn làm thế nào tôi sẽ làm điều này. Bất kỳ ý tưởng?

+1

Vì vậy, bạn muốn có một cái nhìn cố tình lát gạch và làm cho một cái nhìn bình thường để che giấu quan điểm lát gạch ...? Có lẽ một câu hỏi điên rồ nhưng tại sao nó lại được lát gạch để bắt đầu? –

+0

@PauldeLange - Khi chế độ xem lát gạch của tôi được tải lại, 'nhấp nháy' khi các ô được vẽ lại. Sẽ có một UIView bên dưới chế độ xem lát gạch sẽ là bản sao trực tiếp của các ô xếp ở trên. Sau đó, khi các viên gạch được nạp lại, khung nhìn dưới cùng sẽ hiển thị trong một giây sau khi các viên gạch được nạp lại, do đó dừng ảnh hưởng nhấp nháy. Từ những gì tôi có thể nói đây là một thực tế khá phổ biến cho các chương trình đồ họa - sử dụng bộ đệm đồ họa để làm mịn các ảnh hưởng của việc hiển thị bất kỳ nội dung mới nào ở trên. –

+0

Nếu bạn có thể hiển thị chế độ xem nền nhanh hơn các ô xếp, tại sao bạn có các ô xếp? ảnh hưởng -> hiệu ứng bằng cách này. –

Trả lời

3

CATiledLayer là một lớp con của CALayer cung cấp một cách để không đồng bộ cung cấp gạch nội dung của lớp, có khả năng lưu trữ ở nhiều cấp độ chi tiết.

Bạn có thể làm những điều có thể nhìn thấy trong lớp vào một CGContextRef với:

- (void)renderInContext:(CGContextRef)ctx 

Và sau đó sử dụng này để cập nhật lớp khác của bạn bằng cách thiết lập đại biểu của mình và thực hiện

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

ss hiển thị ở đây http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Nhưng thành thật mà nói, tôi không nghĩ rằng điều này là hiệu quả.

+0

Cảm ơn câu trả lời. Bạn nói nó không hiệu quả. Bạn có bất kỳ ý tưởng nào khác có thể giúp giải quyết vấn đề nhấp nháy của tôi không? –

+0

@Luis 'renderInContext' dường như không hoạt động trên' CATiledLayer' như 'CALayer' làm cho tôi. Các gạch không làm gì cả. Bất kỳ ý tưởng? – Tim

0

Vấn đề thực sự của bạn ở đây là nhấp nháy. Tôi đã có một vấn đề tương tự trên một cái nhìn với một CALayer tùy chỉnh sao lưu nó, đây là một phần của giải pháp: Tạo một lớp con tùy chỉnh của CALayer của bạn và thực hiện các phương pháp sau đây:

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

này cố định một tập hợp các vấn đề cho tôi, nhưng có thể không sửa chữa nó cho bạn. Giải pháp thay thế cho bạn có thể vô hiệu hóa các giao dịch trong khi bạn cập nhật: Từ CATransaction Class Reference

setDisableActions: Bộ cho dù hành động kích hoạt như là kết quả của thay đổi sở hữu thực hiện trong vòng nhóm giao dịch này bị ức chế.

Vì vậy, để sử dụng này:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit]; 
Các vấn đề liên quan