inside doesn iphone objective-c ios uiscrollview

iphone - doesn - La propiedad zoomScale de UIScrollView no se actualiza mientras se hace el zoom-rebote



scrollview xcode 9 (5)

Ahora mismo tengo una vista que está fuera de UIScrollView. Por muchas razones, no puede ser simplemente dentro de la vista de desplazamiento. Así que ahora mismo lo que estoy haciendo es que, a medida que se escala / desplaza el UIScrollView, actualizo mi otra vista auxiliar. El único problema en el que estoy entrando es que el valor de zoomScale no se ajusta mientras la vista se recupera a la escala mínima o máxima. ¿Alguna sugerencia sobre cómo obtener este valor mientras se anima?

Código de muestra:

self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, appSize.width, appSize.height)]; self.scrollView.contentSize = CGSizeMake(appSize.width * 2, appSize.height * 2); self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; self.scrollView.delegate = self; self.scrollView.bounces = YES; self.scrollView.bouncesZoom = YES; self.scrollView.alwaysBounceHorizontal = YES; self.scrollView.alwaysBounceVertical = YES; self.scrollView.showsHorizontalScrollIndicator = YES; self.scrollView.showsVerticalScrollIndicator = YES; self.scrollViewZoomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, appSize.width * 2, appSize.height * 2)]; [[self scrollView] addSubview:self.scrollViewZoomView]; float minZoomScale = 2.0f; self.scrollView.minimumZoomScale = minZoomScale; self.scrollView.maximumZoomScale = 1.0f; self.scrollView.zoomScale = self.scrollView.minimumZoomScale;

y luego en uno mismo

-(void) scrollViewDidZoom:(UIScrollView *)scrollView { float scale = [scrollView zoomScale]; [self updateAuxViewScale:scale]; }


Deberías usar un método diferente de UIScrollViewDelegate.

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { // Your code here float scale = [scrollView zoomScale]; [self updateAuxViewScale:scale]; }

De acuerdo con los documentos: https://developer.apple.com/library/ios/#documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html

"La vista de desplazamiento también llama a este método después de cualquier animación de" rebote "."


El rebote del zoom es una animación, por lo que la propiedad zoomScale es inmediatamente el valor objetivo de la animación, incluso si la animación todavía se está ejecutando. Si desea aplicar la misma escala de zoom que tiene la vista de desplazamiento a otra vista, aquí hay una forma de recuperarla:

  1. En -scrollViewDidScroll: verifique si la vista de contenido tiene animaciones.
  2. Si no hay animaciones, solo configure la nueva escala de zoom.
  3. Si hay animaciones, obtenga la duración de una de ellas (las duraciones deben ser todas iguales) y anime su vista con esa duración a la nueva escala de zoom.

Ese enfoque no es elegante, pero funciona. Aquí hay un código para comenzar:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat zoomScale = _scrollView.zoomScale; CALayer *layer = _contentView.layer; NSArray *animationKeys = [layer animationKeys]; if (animationKeys.count == 0) { // set zoomScale on target view } else { CFTimeInterval duration = 0.0; for (NSString *animationKey in animationKeys) { CAAnimation *animation = [layer animationForKey:animationKey]; duration = animation.duration; break; } // easeInEaseOut is the default animation when the zoom bounces [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ // set zoomScale on target view } completion:nil]; } }


Está bien, creo que he encontrado algo que te ayudará. En este hilo relacionado En iOS 4.0, ¿por qué UIScrollView zoomToRect: animated: no activa los delegados scrollViewDidScroll o scrollViewDidZoom mientras anima? , hay dos respuestas que pueden ser de utilidad para usted.

  1. https://.com/a/15512253/1011213
  2. https://.com/a/7553969/1011213

Personalmente, creo que le daría una oportunidad a la primera solución. Espero que entienda la pregunta y esto es útil. Si no ... disculpas y la codificación más feliz!


Gracias a esta respuesta , queda claro que uno puede usar el presentationLayer para obtener los valores correctos. UIScrollView una category UIScrollView para agregar zoomScale especiales para zoomScale , contentOffset y contentOffset que devuelven los valores correctos incluso si el UIScrollView está animando.

Puede encontrar el repositorio aquí: https://github.com/bddckr/BDDRScrollViewExtensions


Según mi conocimiento, si desea conocer el nivel de zoom actual, debe usar el siguiente método de delegado para UIScrollView

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { NSLog(@"Zoomscale %f",scale); }

Espero que esto te sea de utilidad.

Disfruta de la programación !!