iphone objective-c ios uiscrollview

iphone - scrollview swift



¿Cómo hacer zoom en una vista en UIScrollView con un punto de anclaje en el centro? (2)

Sí, creo que puede cambiar el anchorPoint de anchorPoint para la capa de una vista. al igual que -

[self.yourView.layer setAnchorPoint:CGPointMake(0.5, 0)];

Las coordenadas del punto de anclaje se definen correctamente en este diagrama:

Si desea que la animación se ancle desde el centro a la izquierda, configure el punto de anclaje en (0.0, 0.5) es decir, el punto B en la figura.

Tengo una vista en UIScrollView en la que el usuario puede acercarse.

La vista tiene el mismo tamaño que el marco UIScrollView. Sin embargo, las subvistas de esa vista son más grandes y centradas. Es un contenedor del mismo tamaño que UIScrollView con contenido centrado.

Al alejarse, UIScrollView cambia la escala del contenido con un punto de anclaje incómodo en la esquina superior izquierda, en lugar de uno centrado.

¿Hay alguna forma de cambiar este comportamiento, de modo que al acercar o alejar el zoom, el zoom se produzca en relación con el centro en lugar de la esquina superior izquierda?


El comportamiento se puede cambiar para hacer zoom en el centro, pero la técnica es complicada.

Supongamos que tiene una vista de desplazamiento de tamaño (300,300) con una sola subvista con zoom, self.imageView , que se encuentra inicialmente en (0,0,300,300). Ahora quieres alejar la imagen. Lo que está sucediendo es que contentOffset siempre permanece (0,0) a medida que aleja. Esto lleva a la apariencia de que está haciendo zoom con el punto de anclaje en la esquina superior izquierda.

Sin embargo, cambiar el punto de anclaje en cualquier vista no ayudará aquí; esto se debe a que el comportamiento de zoom de la vista de desplazamiento no es solo una transformación de zoom aplicada a alguna subvista. La apariencia del contenido en la vista de desplazamiento está controlada por contentInset y contentOffset , que son variables separadas mantenidas por la vista de desplazamiento. Debe modificar el comportamiento del desplazamiento de contenido y el contenido insertado durante el zoom.

Una solución es ajustar el contentInset forma dinámica a medida que se desplaza la vista de desplazamiento. El objetivo es mantener la imagen siempre centrada en el área visible de la vista de desplazamiento.

Al inicializar la vista de desplazamiento, prepare su marco de esta manera:

- (void) viewDidLoad { //// ....... self.scrollView.zoomScale = 1; self.scrollView.minimumZoomScale = fminf(1, fminf(self.scrollView.frame.size.width/(self.imageView.image.size.width+1), self.scrollView.frame.size.height/(self.imageView.image.size.height+1))); CGFloat leftMargin = (self.scrollView.frame.size.width - self.imageView.image.size.width)*0.5; CGFloat topMargin = (self.scrollView.frame.size.height - self.imageView.image.size.height)*0.5; self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); [self assignInsetsOnScroller]; // this has to be done before settings contentOffset! self.scrollView.contentOffset = CGPointMake(fmaxf(0,-leftMargin), fmaxf(0,-topMargin)); self.scrollView.contentSize = CGSizeMake(fmaxf(self.imageView.image.size.width, self.scrollView.frame.size.width+1), fmaxf(self.imageView.image.size.height, self.scrollView.frame.size.height+1)); }

Configure un delegado para la vista de desplazamiento, anule scrollViewDidScroll: y haga algo como esto:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { [self assignInsetsOnScroller]; } - (void) assignInsetsOnScroller { CGFloat leftMargin = (scrollView.frame.size.width - self.imageView.frame.size.width)*0.5; CGFloat topMargin = (scrollView.frame.size.height - self.imageView.frame.size.height)*0.5; scrollView.contentInset = UIEdgeInsetsMake(fmaxf(0, topMargin), fmaxf(0, leftMargin), 0, 0); }

Cada gesto de pellizco dará lugar a una acción de desplazamiento. El resultado es que las inserciones se ajustan dinámicamente, de modo que la imagen imageView siempre aparece en el centro de la vista de desplazamiento.