2009-02-28 27 views
5

DrawRect của Everytime UIView được gọi, nội dung được vẽ bởi drawRect trước đó (sử dụng Core Graphics) sẽ bị xóa. Làm thế nào tôi có thể làm cho nó để các đường dẫn được hiển thị từ các cuộc gọi drawRect trước đây vẫn tồn tại cho đến khi tôi xóa nó một cách rõ ràng?Làm thế nào để ngăn chặn drawRect của UIView từ thanh toán bù trừ ra các đường dẫn được rút ra bởi các cuộc gọi drawRect trước đó?

Trả lời

3

Bạn về cơ bản cần phải cắt phần 'bẩn' của trực tuyến của bạn, nơi thay đổi đã được thực hiện, và chỉ phần này sẽ được vẽ lại.

- (void)setNeedsDisplayInRect:(CGRect)invalidRect 
+2

Vấn đề không phải là rect không được vẽ lại mà là khi drawRect được phát hành lại, nó xóa tất cả các đường dẫn được vẽ trước đó. Có vẻ như đó là hành vi mặc định với thường trình vẽ của Core Graphic. – Boon

0

Tôi chắc chắn không có cách nào xung quanh việc này; đó là cách UIView được thiết kế để hoạt động. Nếu được yêu cầu, chế độ xem tùy chỉnh của bạn sẽ có thể vẽ bất kỳ phần nào của chính nó bất kỳ lúc nào. Điều này một phần vì lượt xem có thể làm nhiều hơn là chỉ xuất hiện trên màn hình. ví dụ. trên máy tính để bàn, chúng có thể được in và thậm chí trên iPhone, bạn có thể muốn chụp nội dung của chế độ xem thành bitmap.

1

Tôi đang tự đấu tranh vấn đề này ngay bây giờ. Vấn đề là có một tài sản trên UIView gọi là "clearsContextBeforeDrawing" mà theo tài liệu có nghĩa vụ phải khắc phục vấn đề này, tuy nhiên nó không hoạt động theo cách đó trong kinh nghiệm của tôi.

Tôi nghĩ cuối cùng giải pháp cho việc này là phân bổ bộ đệm ngoài màn hình và thực hiện tất cả bản vẽ ở đó, sau đó chuyển nó lên UIView trong phương thức drawRect.

+1

Vâng, điều đó cũng làm tăng các vấn đề KHÁC: một là iPhone/iPad chỉ hỗ trợ RGBA chứ không phải RGB, vì vậy việc cập nhật màn hình yêu cầu RGBA-> RGB chuyển đổi (chiếm 99% thời gian.) Plus, nó vẫn sẽ xóa UIView vô ích, hoàn toàn không có mục đích. Nếu có ai biết cách giải quyết những vấn đề này, xin hãy ping! – gilm

+0

Tôi nghĩ rằng sử dụng một bộ đệm offscreen có thể là giải pháp quá (CGLayer/CGRect), nhưng sau khi cố gắng này nó đã không có cải thiện đáng chú ý về hiệu suất. Có vẻ như hành động vẽ bối cảnh toàn màn hình chậm bất kể độ phức tạp của thao tác vẽ. –

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