Tôi đang làm việc trên một ứng dụng vẽ có sử dụng CoreGraphics để hiển thị. Vấn đề của tôi là, đối với hiệu suất, tôi đang cố gắng giới hạn các bản cập nhật cho chỉ một số phần nhất định của chế độ xem đã thay đổi. Đối với điều đó, tôi sử dụng setNeedsDisplayInRect :, nhưng đôi khi chế độ xem cập nhật toàn bộ nội dung của nó, gây gián đoạn. Điều này đặc biệt rõ ràng trên iPad thế hệ thứ 3, nhưng nó cũng xảy ra trong trình mô phỏng và iPad2 ở mức độ thấp hơn. Tôi đang cố xóa hành vi này.setNeedsDisplayInRect: làm cho toàn bộ chế độ xem được cập nhật
Để hiển thị sự cố, tôi đã tạo một dự án "xem đơn" đơn giản bằng cách sử dụng mẫu trong Xcode. Đã tạo lớp con UIView tùy chỉnh mà tôi đặt làm chế độ xem của trình điều khiển chế độ xem trong tệp xib.
gia tăng này đến UIViewController:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Asks that the view refreshes a smal rectangle
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 20, 20)];
}
gia tăng này đến MyView (xem tùy chỉnh của tôi):
- (void)drawRect:(CGRect)rect
{
// Just log what is being updated
NSLog(@"%@", NSStringFromCGRect(rect));
}
Và đó là nó. Nếu tôi chạy ứng dụng trên iPad thứ 10 (thiết bị thực tế), nhật ký hiển thị chế độ xem tự vẽ lại trong entierty của nó theo thời gian (như thường xuyên). Điều này thật khó chịu và tôi không biết ý tưởng
CẬP NHẬT: Dưới đây là một số nhật ký. Nó chắc chắn cho thấy xem đầy đủ được cập nhật đôi khi. Tôi cố gắng để làm cho nó dừng lại hoàn toàn nhưng không thể tìm cách ...
2012-05-04 08:34:01.851 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.184 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.197 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.215 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.226 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.242 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.258 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.274 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.290 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.306 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.322 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.338 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.354 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.371 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.387 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.403 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.419 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.439 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.457 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
Ngoài ra nếu tôi ngừng chuyển động trong hơn 10s hoặc lâu hơn và sơ yếu lý lịch, nó chắc chắn có phải nó rất nhất quán:
2012-05-04 08:34:33.305 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:33.321 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:35:00.202 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.221 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.234 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.251 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
Trong trường hợp của tôi, khi drawRect gọi sau khi setNeedsDisplayInRect ** lần đầu tiên **, rect là giới hạn đầy đủ (không hỏi lý do của tôi), bất kỳ cuộc gọi tiếp theo nào chính xác là rect tôi đã chỉ định làm tham số trong setNeedsDisplayInRect. Bạn đã kiểm tra cảm ứng di chuyển nhiều lần? –
Nó xảy ra chủ yếu trên thiết bị trực tiếp. Nhưng bạn có thể làm cho nó xảy ra trên giả lập nếu bạn di chuyển ngón tay của bạn xung quanh và sau đó chờ khoảng 10 hoặc 15 giây, sau đó chạm và di chuyển một lần nữa. Trên thiết bị iPad3, nó xảy ra ngay cả khi ngón tay đang di chuyển. Sooo gây phiền nhiễu :) – mprivat
Tôi đăng @ này một lúc trở lại (http://stackoverflow.com/questions/9299018/setneedsdisplayinrect-bug-in-ios5). Dường như chỉ là cuộc gọi đầu tiên. Tôi chưa bao giờ tìm thấy nguyên nhân/sửa chữa và chỉ tiếp tục vì tôi không cần mức tối ưu hóa hiệu suất đó.Bạn có thể kiểm tra kích thước xem rect == và không vẽ không? Có lẽ không phải là một lựa chọn. –