To, czy CADisplayLink
strzela podczas przewijania, zależy od trybu, w którym zostanie dodane do pętli uruchamiania. Prawdopodobnie masz to gdzieś:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIApplication dodaje tryb pętli biegać, UITrackingRunLoopMode
, za „śledzenie w kontroli”, który zawiera kiedy Scrollview jest przewijanie. Więc w tym momencie runloop zostanie wyłączony z trybu domyślnego, a zatem twoje łącze wyświetlania (a także dowolne zegary, NSURLConnections
itd., Dodane w trybie domyślnym) nie zostanie uruchomione, dopóki nie zostanie przywrócony tryb domyślny.
Szybka poprawka: zmienić swój kod do:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
UITrackingRunLoopMode jest uważana za jedną z najczęstszych sposobów.
Spędzanie zbyt dużej ilości czasu przerywającego UIKit może prowadzić do bardzo złej odpowiedzi kontrolnej, więc musisz zachować ostrożność. Byłoby odejście od tematu masowo, ale chociaż OpenGL jest modalny i dlatego nie jest szczególnie przyjazny dla wątków, możesz użyć grupy EAGLShare do renderowania w oddzielnym wątku, a następnie wepchnąć go do głównego wątku.
Przykładem w (2016) Swift3 ...
let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha))
d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
//and then, for example...
func updateAlpha() {
let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat
follower.alpha = a
}
2016 - Wydawałoby się, że ** commonModes ** jest rzeczywiście rozwiązanie dla typowych nowoczesnych iOS.. Zobacz: http://stackoverflow.com/a/4878182/294884 To dość niewiarygodne, że przez pięć lat nie było żadnej kontroli jakości. – Fattie