2009-03-03 24 views
70

Trong khi UIScrollView (hoặc một lớp dẫn xuất của chúng) đang cuộn, có vẻ như tất cả các NSTimers đang chạy bị tạm dừng cho đến khi cuộn xong.UIScrollView tạm dừng NSTimer cho đến khi cuộn xong

Có cách nào để giải quyết vấn đề này không? Chủ đề? Cài đặt ưu tiên? Có gì không?

+1

xem xét chấp nhận [Kashif] (http://stackoverflow.com/users/211439/kashif-hisam) 's [trả lời] (http: // stackoverflow.com/a/2742275/865175)! –

+0

Có thể trùng lặp [Tại sao UIScrollView tạm dừng CADisplayLink của tôi?] (Http://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink) – Fattie

+0

bảy năm sau ... http: // stackoverflow .com/a/12625429/294884 – Fattie

Trả lời

183

An dễ & đơn giản để thực hiện giải pháp là để làm:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
             target:... 
             selector:.... 
             userInfo:... 
             repeats:...]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+8

Tôi có thể xác nhận rằng phương thức này hoạt động. – Tyler

+1

UITrackingRunLoopMode là chế độ - và công khai của nó - bạn có thể sử dụng để tạo các hành vi hẹn giờ khác nhau. –

+0

Yêu thích nó, hoạt động như một sự quyến rũ với GLKViewController là tốt. Chỉ cần đặt controller.paused thành YES khi UIScrollView xuất hiện và bắt đầu hẹn giờ của riêng bạn như được mô tả. Đảo ngược nó khi scrollview được loại bỏ và thats nó! Vòng lặp cập nhật/kết xuất của tôi không phải là quá đắt, do đó có thể hữu ích. –

5

Bạn phải chạy một chuỗi khác và một vòng lặp chạy khác nếu bạn muốn hẹn giờ kích hoạt trong khi cuộn; vì bộ hẹn giờ được xử lý như là một phần của vòng lặp sự kiện, nếu bạn đang bận xử lý cuộn chế độ xem của mình, bạn sẽ không bao giờ gặp lại bộ tính giờ. Mặc dù hình phạt hoàn hảo/pin của bộ đếm thời gian chạy trên các chủ đề khác có thể không đáng để xử lý trường hợp này.

+10

Nó không yêu cầu một chuỗi khác, xem [answer] gần đây hơn (http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes/2742275 # 2742275) từ Kashif. Tôi đã thử nó và nó hoạt động mà không cần thêm thread. – progrmr

+3

Không cần một chủ đề khác. Câu trả lời của Kashif là tốt hơn nhiều. – stigi

+1

Tôi đã cho nó một upvote –

8

Có, Paul là đúng, đây là một vấn đề vòng lặp chạy. Cụ thể, bạn cần phải tận dụng các phương pháp NSRunLoop:

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
7

Đây là phiên bản nhanh chóng.

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true) 
      NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
16

Đối với bất cứ ai sử dụng Swift 3

timer = Timer.scheduledTimer(timeInterval: 0.1, 
          target: self, 
          selector: aSelector, 
          userInfo: nil, 
          repeats: true) 


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 
+0

Cảm ơn bạn rất nhiều:) – IOSDev