2010-11-05 27 views
17

Tôi có phần tử giao diện người dùng vòng tròn xoay vòng được cập nhật bởi NSTimer. Tôi cũng có một UIScrollView mà sẽ 'chặn' vòng tròn quay trong khi được cuộn. Điều đó được mong đợi, bởi vì bộ đếm thời gian và chế độ xem cuộn nơi cả hai đều trong cùng một chuỗi.Các phần tử giao diện người dùng tùy chỉnh của tôi không được cập nhật trong khi UIScrollView được cuộn

Vì vậy, tôi đặt hẹn giờ trong một chuỗi riêng biệt về cơ bản hoạt động tuyệt vời! Tôi có thể thấy nó hoạt động vì NSLogs tiếp tục đến ngay cả khi đang di chuyển.

Nhưng vấn đề của tôi là vòng tròn quay của tôi vẫn dừng lại khi cuộn! Tôi nghi ngờ vẽ lại được tạm dừng cho đến lần lặp tiếp theo của vòng lặp chạy của luồng chính (?). Vì vậy, ngay cả khi góc của nó được thay đổi mọi lúc, nó có thể không được vẽ lại ...

Bất kỳ ý tưởng nào tôi có thể làm? Cảm ơn!

Trả lời

42

Trong khi cuộn, vòng lặp chạy của luồng chính nằm trong UITrackingRunLoopMode. Vì vậy, những gì bạn cần làm là lên lịch hẹn giờ của bạn ở chế độ đó (có thể ngoài chế độ mặc định). Tôi tin rằng NSRunLoopCommonModes bao gồm cả các mặc định và các chế độ theo dõi sự kiện, vì vậy bạn chỉ có thể làm điều này:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.42 target:foo selector:@selector(doSomething) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Bằng cách này, bạn nên làm điều này tất cả về các chủ đề chính. Không cần phải sinh ra một luồng nền (trừ khi mỗi lời gọi hẹn giờ sẽ thực hiện một số xử lý dài).

+0

+1, hoạt động tốt cho tôi. – pt2ph8

+0

Bạn nói đúng, NSRunLoopCommonModes là chế độ chính xác cho việc này, cảm ơn! Tôi đã loại bỏ các chủ đề nền và bộ đếm thời gian bắn ngay bây giờ, ngay cả trong khi di chuyển.Nhưng vấn đề của tôi vẫn còn đó, không có vẽ lại xảy ra. – Sebastian

+0

Bạn đang làm gì để kích hoạt vẽ lại? Tôi sẽ nghĩ rằng một 'setNeedsDisplay' sẽ làm thủ thuật. Có lẽ bạn nên đăng phương thức hẹn giờ của mình. –

0

Bạn đúng là UIScrollView không cập nhật chế độ xem nội dung trong khi cuộn.

Có lẽ đặt cược tốt nhất của bạn - và đây là thứ gì đó của hack - là hiển thị riêng chế độ xem động của bạn (có thể trong khung xem, để cắt miễn phí) và sử dụng số lần gọi lại để xem ra vị trí hiện tại của di chuyển và vị trí hoạt hình của bạn cho phù hợp.

LƯU Ý: đề xuất này là một hack! Nó không phải là thực hành tốt nhất và nó chắc chắn truy cập vào mã đơn giản, duy trì mà không có tác dụng phụ. Tuy nhiên, đó là cách duy nhất tôi có thể nghĩ để có được màn hình bạn muốn.

Một mẹo khác: suy nghĩ lại tầm quan trọng của việc hiển thị nội dung hoạt ảnh của chế độ xem cuộn khi đang di chuyển.

+0

Không, vòng tròn quay động không phải là một phần của nội dung của chế độ xem cuộn! Xin lỗi, có lẽ tôi đã không rõ ràng về điều đó. – Sebastian

3

UIScrollView không chỉ chặn NSTimers, nó chặn toàn bộ chuỗi chính. Và các đối tượng UIKit chỉ nên được truy cập trên chủ đề chính (và, thường được giới hạn theo những cách không thể đoán trước nếu bạn cố né tránh giới hạn đó), đó có thể là lý do tại sao - ngay cả khi bạn có đồng hồ đến từ một chủ đề bên ngoài - bạn không thể đăng cập nhật.

Đó là một chút né tránh, nhưng có cách nào hoạt ảnh của bạn có thể đạt được bằng CoreAnimation không? Những điều gắn liền với điều đó tiếp tục làm việc không phân biệt những gì đang xảy ra trong chủ đề chính.

+0

Vâng, bộ hẹn giờ không bị chặn. Tôi có nó chạy trên thread chính trong NSRunLoopCommonModes bây giờ và nó cháy ngay cả trong khi di chuyển. Nhưng quan điểm của tôi không được vẽ lại, ít nhất là không thông qua cơ chế displayNeedsDisplay/display của UIView. Các tài liệu nói: 'Bất kỳ đối tượng UIView nào được đánh dấu là cần hiển thị sẽ tự động được hiển thị lại khi ứng dụng quay trở lại vòng lặp chạy.' – Sebastian

+0

CA là một ý tưởng tuyệt vời, tôi sẽ cố gắng! – Sebastian

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