2009-03-05 16 views
5

Tôi đang cố triển khai chức năng sơn đơn giản trong ứng dụng iPhone của mình. Tôi đã thử cập nhật một bitmap với một bàn chải bitmap, và tôi cũng đã thử this tutorial.không thể vẽ đủ nhanh để theo kịp với chạm được yêu thích?

Cả hai phương pháp đều có cùng một vấn đề, mặc dù mã này gần như hoàn toàn khác nhau. Nó chỉ xảy ra trên thiết bị - trình mô phỏng hoạt động tốt.

Khi tôi chạm vào màn hình và di chuyển ngón tay, màn hình không được cập nhật. Khi tôi tạm dừng hoặc nhấc ngón tay lên, màn hình sẽ được cập nhật. Đây không phải là trải nghiệm người dùng tốt!

Tôi đã thử gọi drawRect từ chạm trực tiếp, nhưng thấy rằng ngữ cảnh vẽ (mà tôi truy xuất bằng UIGraphicsGetCurrentContext) không hợp lệ đối với nhiều cuộc gọi, vì vậy hãy tự vẽ bản thân màn hình cho mọi touchesMoved.

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

Cảm ơn bạn đã giúp đỡ, điều này đã khá bực bội!

Henning

Trả lời

0

Bạn không thể gọi trực tiếp drawRect:. Để làm mới màn hình của bạn theo yêu cầu, hãy thử gọi [self setNeedsDisplay] từ phương thức touchesMoved của bạn, thao tác này sẽ thiết lập ngữ cảnh thích hợp cho cuộc gọi đến drawRect:.

+0

Cảm ơn, nhưng tôi đã thử thực hiện [self setNeedsDisplay] từ touchesMoved. Nó không giúp được gì. – Henning

2

Nghe có vẻ như tôi không cho vòng lặp chạy chính có cơ hội cập nhật màn hình. Mã vẽ của bạn có thể mất nhiều thời gian hơn để thực thi so với thời gian giữa các sự kiện cảm ứng, do đó màn hình không bao giờ được cập nhật. Khi bạn nhấc ngón tay lên, nó sẽ cập nhật vì nó không còn bị đè nặng với bản vẽ của bạn nữa.

Bạn có thể xem xét tối ưu hóa bản vẽ của mình để tăng tốc độ vẽ (ví dụ: chỉ vẽ trong khu vực bẩn của màn hình), sử dụng một cái gì đó như NSOperationQueue để xếp hàng các phép tính nặng của bản vẽ của bạn để chạy trên một chuỗi nền hoặc chọn lọc thả các sự kiện vẽ cảm ứng để giữ cho phản hồi của bạn trôi chảy.

Một khả năng bổ sung là đặt mã bản vẽ nặng của bạn theo một phương thức riêng và gọi nó qua performSelector: withObject: afterDelay, với thời gian trễ là 10 mili giây (hoặc nhỏ hơn). Điều này có thể cung cấp cho vòng lặp chạy chính một cơ hội để cập nhật màn hình với trạng thái hiện tại của nó. Tôi đã không thử nghiệm này, nhưng nếu tôi nhớ chính xác tôi đã nhìn thấy công việc này.

+0

Tôi sẽ thử và xem nó như thế nào. Cảm ơn bạn. – Henning

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