UIScrollViewを操作している間、NSTimerが反応しない問題の簡単な説明

February 03, 2015

かなり昔に一度調べたことがあるけれど、忘れないようにちょっと書いておく。NSTimerがUIScrollView - UITableViewとかそういう継承したものも含めて - をスクロール中に動かなくなってしまう問題。

問題自体は非常にシンプルで、普通、NSTimerはNSDefaultRunLoopModeにaddされる。だけど、UIScrollViewをユーザーが操作している間は、Run Loop Modeが NSEventTrackingRunLoopModeに変わる。すると、NSTimerが発火しなくなる。

これを回避するためには、独立したNSRunLoopCommonModesにNSTimerをaddすれば良い。

self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0 / 60.0, target: self, selector: “update:”, userInfo: nil, repeats: true) NSRunLoop.mainRunLoop().addTimer(self.timer!, forMode: NSRunLoopCommonModes)

僕の場合はこのようにした。self.timerinvalidate()する時のために、weakで参照している。

参考


Profile picture

Written by morizotter who lives and works in Tokyo building useful things. You should follow them on Twitter