2010-05-10 18 views
6

Trong mã của tôi, tôi đang cố hiển thị UIWebView khi trang đang tải, sau đó, khi xong, hãy chụp ảnh từ chế độ xem web vào bộ nhớ cache và hiển thị sau (vì vậy tôi không phải tải lại và hiển thị trang web).Làm cách nào để biết khi nào một UIWebView đã vẽ xong một ngữ cảnh?

Tôi có một cái gì đó dọc theo dòng:

CGContextRef context = CGBitmapContextCreate(…); 
[[webView layer] renderInContext:context]; 

CGImageRef imageRef = CGBitmapContextCreateImage(context); 
UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Vấn đề tôi đang chạy vào đó là, do UIWebView 's ốp lát, đôi khi chỉ một nửa số trang được trả lại với bối cảnh của thời gian Tôi chụp hình.

Có cách nào để phát hiện hoặc chặn trên chuỗi hiển thị nền của UIWebView để tôi có thể lấy hình ảnh chỉ sau khi tất cả kết xuất đã hoàn tất?


UPDATE: Nó có thể là điều kiện chủ đề chủng tộc là một cá trích đỏ (đó là chưa rõ ràng từ các tài liệu, ở mức nào, cho dù lớp tùy chỉnh UIWebView 's hoặc một CATiledLayer trong khối chung về chủ đề nền tảng của nó) .

Thay vào đó, đây có thể là vấn đề vô hiệu hóa (mặc dù có một số loại gọi đến setNeedsDisplay trên cả hai lớp UIWebView và lớp của nó). Thay đổi các giới hạn của UIWebView trước khi hiển thị nó dường như đã loại bỏ vấn đề "không vẽ toàn bộ điều".

Tôi vẫn gặp phải sự cố khi một vài ô được vẽ ở quy mô cũ, nhưng gọi số renderInContext: hai lần dường như đã giảm nhẹ đến mức đủ.

Trả lời

0

UIWebView có thể đang sử dụng CATiledLayer hoặc tùy chỉnh dẫn xuất. Bạn có thể thay thế lớp bằng thứ gì đó mà bạn chọn như là một CALayer đơn giản mà không vẽ bản vẽ. Thay thế lớp trước khi bạn bắt đầu tải nội dung.

Nếu thay thế lớp bằng một CALayer chuẩn không hoạt động, bạn có thể phải tạo lớp con của riêng bạn mô phỏng hành vi của CATiledLayer mà không thực sự được tạo luồng.

Edit:

Từ CATiledLayer.h

/* Note: do not attempt to directly modify the `contents' property of 
* an CATiledLayer object - doing so will effectively turn it into a 
* regular CALayer. */ 

Vì vậy, bạn chỉ có thể thiết lập các nội dung để nil trước khi gọi renderInContext: