Pregunta

Tengo una instancia de UIScrollview que contiene una instancia de UIView. El UIView es solo un contenedor para una matriz horizontal de instancias UIImageView. - El zoom es proporcionado por UIScrollView y UIScrollViewDelegate. Me gustaría restringir el zoom para que se produzca solo a lo largo del eje horizontal sin escala vertical en absoluto. ¿Cómo hago esto?

¿Hay alguna manera, por ejemplo, de subclasificar UIView y anular el método apropiado para evitar el escalamiento vertical? Me gusta este enfoque, pero no tengo claro qué método anular y qué debería hacer ese método anulado.

Saludos, Doug

¿Fue útil?

Solución

Similar a lo que describo en esta respuesta , puede crear una subclase de UIView y anular el método de acceso -setTransform: para ajustar la transformación que UIScrollView intentará aplicar a su UIView. Configure esta UIView para alojar sus subvistas de contenido y convertirla en la subvista de UIScrollView.

Dentro de su -setTransform reemplazado :, deberá tomar la transformación que UIScrollView le gustaría aplicar y ajustarla para que la escala solo surta efecto en una dirección. Del documentación sobre cómo se construyen las matrices CGAffineTransform , creo que la siguiente implementación debería limitar su escalamiento a lo largo de la dirección horizontal:

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}

Otros consejos

Con OS 3.0, puede indicarle al zoom que se acerque a un rect en la vista de desplazamiento. Tengo esto en mi lógica que detecta grifos.

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

Para la otra parte, tendrá que estirar las vistas de su imagen en la proporción que tiene el nuevo marco con respecto al original, y centrarlo en el mismo punto central. Puede hacer esto en una animación programada igual que la animación de zoom para que se vea bien, pero creo que esta será la única forma de hacerlo.

En scrollViewDidZoom: , ajuste las variables de su vista de contenido en función de zoomScale , restablezca zoomScale a 1.0, luego haga setNeedsDisplay en la vista de contenido. Maneje el zoom real (en la dirección que desee) en la vista de contenido drawRect: .

Los detalles feos:

  1. Mientras el zoom está en progreso, el UIScollView cambia contentOffset y contentScale , así que guarde esos valores anteriores en scrollViewWillBeginZooming: y en scrollViewDidZoom: para que pueda calcular un nuevo contentOffset usted mismo de acuerdo con el zoom.

  2. Dado que al cambiar zoomScale se disparará inmediatamente otro scrollViewDidZoom: , debe establecer un BOOL antes (y borrar después) restablecer el zoomScale . Pruebe el BOOL al comienzo de scrollViewDidZoom: y devuelva si es verdadero.

  3. Puede que necesite inhibir scrollViewDidScroll: mientras el zoom está en progreso (pruebe un BOOL; configúrelo en scrollViewWillBeginZooming: y bórrelo en scrollViewDidEndZooming: ) para que se utilicen sus propios contentOffsets mientras el zoom está en progreso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top