has doesn content iphone objective-c ios uiviewcontroller uiscrollview

iphone - doesn - uiscrollview swift 4



La actualizaciĆ³n de UILabel se detiene durante el desplazamiento de UIScrollView (5)

Hace poco tuve el mismo problema y encontré la solución aquí: mis elementos personalizados de interfaz de usuario ...

En resumen: mientras su UIScrollView se desplaza, el NSTimer no se actualiza porque los bucles de ejecución se ejecutan en un modo diferente (NSRunLoopCommonModes, modo utilizado para el seguimiento de eventos).

La solución es agregar su temporizador a NSRunLoopModes justo después de la creación:

NSTimer *elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(updateElapsedTimeLabel) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:elapsedTimeTimer forMode:NSRunLoopCommonModes];

(El código proviene de la publicación vinculada anteriormente).

Tengo un scrollView con una imageView dentro de él. El scrollView es una subvista de la supervista, y la imageView es una subvista de la scrollView . También tengo una etiqueta (en el nivel de supervista) que recibe valores actualizados en su propiedad de texto desde un NSTimer cada milisegundo.

El problema es: durante el desplazamiento, la etiqueta se detiene para mostrar las actualizaciones. Cuando el desplazamiento finaliza, las actualizaciones en la etiqueta se reinician. Cuando las actualizaciones se reinician son correctas; esto significa que los valores de label.text se actualizan como se esperaba, pero mientras se desplaza, la visualización de las actualizaciones se anula en alguna parte. Me gustaría mostrar las actualizaciones en la etiqueta independientemente de que se desplace o no.

Así es como se implementan las actualizaciones de etiquetas:

- (void)startElapsedTimeTimer { [self setStartTime:CFAbsoluteTimeGetCurrent()]; NSTimer *elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(updateElapsedTimeLabel) repeats:YES]; } - (void)updateElapsedTimeLabel { CFTimeInterval currentTime = CFAbsoluteTimeGetCurrent(); float theTime = currentTime - startTime; elapsedTimeLabel.text = [NSString stringWithFormat:@"%1.2f sec.", theTime]; }

Gracias por cualquier ayuda.


He visto un comportamiento similar en combinación con desplazar un UIScrollView. Lo que probablemente ocurre es que la acción de desplazamiento bloquea por completo el ciclo de ejecución principal , que es responsable de todo lo relacionado con la visualización de actualizaciones. No está haciendo nada mal aquí, las actualizaciones de la jerarquía de vistas deberían ser manejadas por el bucle principal, así que no puede simplemente poner su actualización de UILabel en un hilo de fondo (aunque probablemente todavía lo intente para ver qué sucede).

Realmente no he investigado este tema, pero supongo que hay poco que puedes hacer al respecto. ¡Aceptaré felizmente las respuestas que demuestren que estoy equivocado!


solución en Swift 2:

self.updateTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "updateFunction", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(self.updateTimer, forMode: NSRunLoopCommonModes)


solución en Swift 3.x:

self.updateTimer = Timer.scheduledTimer(timeInterval:1.0, target: self, selector: "updateFunction", userInfo: nil, repeats: true) RunLoop.current.add(self.updateTimer, forMode: RunLoopMode.commonModes)


solución en Swift 4:

timer = Timer(timeInterval: 1, repeats: true) { [weak self] _ in self?.updateTimeLabel() } RunLoop.current.add(timer, forMode: .commonModes)