2009-07-15 36 views
12

Trên iPhone (mặc dù tôi tưởng tượng đó là một câu hỏi không kém hợp lệ trong Cocoa) Tôi có một UIScrollView xung quanh một UIView được hỗ trợ bởi một CATiledLayer. Cách nó hoạt động theo mặc định là tải bất kỳ lát gạch không có/không được mở nào khi khung nhìn của tôi cuộn qua một phần trống của CATiledLayer.Tải trước/gạch hiển thị trước trong một CATiledLayer?

Điều tôi muốn biết là có cách nào kích hoạt CATiledLayer để tải một lát không được hiển thị? Ví dụ, tôi muốn tải trước tất cả các ô liền kề với ô được hiển thị hiện tại trong khi chúng vẫn ở chế độ không dùng màn hình, do đó tránh nhấp nháy một màn hình trống mờ dần vào hình ảnh khi nó được tải không đồng bộ.

Bất kỳ ý tưởng nào?

+0

Bạn đã xác định điều này? Tôi thực sự muốn biết làm thế nào bạn đã làm nó nếu bạn đã làm. –

+0

Không. Không bao giờ làm. :(Sử dụng setNeedsDisplayInRect: hoạt động để làm mới nội dung của một ô đã được tải, nhưng dường như không làm cho nó tải trước. – jemmons

Trả lời

14

Tôi không nghĩ CATiledLayer sẽ làm những gì bạn muốn. Có một vài lựa chọn khác mặc dù. Trước tiên, bạn có thể vô hiệu hóa các ngói fade-in và có nó hiển thị ngay lập tức với một cái gì đó như thế này:

@interface NoFadeTiledLayer : CATiledLayer { 
} 
@end 

@implementation NoFadeTiledLayer 
+ (CFTimeInterval)fadeDuration { 
    return 0.0; 
} 
@end 

@implementation MyViewWithTiledLayer 
+ (Class)layerClass { 
    return [NoFadeTiledLayer class]; 
} 
... 
@end 

Thứ hai, bạn có thể làm của riêng bạn tìm nạp trước và bộ nhớ đệm của gạch liền kề để họ đã sẵn sàng để đi khi Các cuộc gọi CATileLayer drawLayer: inContext. Tôi muốn thực hiện scrollViewDidScroll: và scrollViewDidZoom: để xác định các tile liền kề và levelOfDetail. Sau đó, thực hiện tra cứu bộ nhớ cache và thêm bất kỳ thứ gì không có trong hàng đợi tìm nạp trước/hiển thị. Chủ đề nền có thể phục vụ hàng đợi và các cuộn hoặc thu phóng tiếp theo sẽ xóa và tạo lại hàng đợi. Sau đó, có drawLayer: inContext kiểm tra cache trước và chỉ lấy/render nếu cần thiết.

+1

Tôi đã thử phương pháp này để tiếp cận (bao gồm cả lớp con không có thời gian mờ dần) và nó dường như không giúp được gì nhiều, thật không may, tôi không biết tại sao, nó chắc chắn giống như một cách tiếp cận tốt. –

0

Bạn nên thử gọi setNeedsDisplayInRect: trên các khu vực bạn muốn hiển thị. Nếu bạn muốn giữ trong phạm vi ranh giới gạch, bạn có thể sử dụng thuộc tính tileSize để tính ranh giới ô.

Nhưng tôi không biết chắc chắn liệu điều này có hiệu quả hay không và chúng tôi không biết cơ chế lưu giữ lát bộ nhớ đệm hoạt động như thế nào.

4

CATileLayer là một trong những lớp học bực bội khi nó làm một điều tuyệt vời, nhưng không có sự linh hoạt với nó.

Tại thời điểm này tất cả những gì còn lại với chúng ta là sự sáng tạo:

1) Thực hiện di chuyển của bạn xem khổng lồ. Tôi đã thử 5x kích thước của màn hình trước khi tôi ngừng nhìn thấy các ô "trống". Hãy cảnh giác với việc sử dụng bộ nhớ! Bạn đang vẽ đến một khu vực rộng lớn mặc dù người dùng chỉ nhìn thấy 2% của nó.

2) Có hai phiên bản hình ảnh của bạn, một hình ảnh có độ phân giải cao và một số ít độ phân giải thấp. bạn sẽ có thể ghi lại độ phân giải thấp rất nhanh và về cơ bản bạn sẽ bị "mờ" thay vì gạch "trống". Mã mẫu của Apple ZoomingPDFViewer cho bạn thấy cách thực hiện điều này.

http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html

Tất nhiên, một số kết hợp cả hai có thể làm việc nếu bạn muốn đầu tư thời gian.

+0

Tất cả các ý tưởng tuyệt vời.Tôi muốn tôi có thể đặt tên cho hai câu trả lời! – jemmons

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