ios - vehicular - ¿Es posible tener un UIImageView dentro de un UIScrollView acercar y alejar, pero se adhieren al centro con Auto Layout?
restriccion de transito microcentro mapa 2018 (2)
Al usar Autolayout, las llamadas a setFrames no toman efectos, por eso el imageView no está centrado en su scrollView.
Dicho esto, para lograr el efecto central puede elegir entre:
La forma más fácil es establecer traduceAutoresizingMaskIntoConstraints a
YES
para tu imageView enViewDidLoad
, que traducirá las llamadas asetFrame:
a nuevas restricciones basadas en tu imageView autoresizingMask . Pero debes asegurarte de que las nuevas restricciones estén satisfechas con las que configuraste en tu guión gráfico (en tu caso, ninguna).En su método
scrollViewDidZoom:
agregue directamente las restricciones para centrar su imageView
-
[self.imageView addConstraint:[NSLayoutConstraint constraintWithItem:self.imageView
attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual
toItem:self.scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0
constant:0]];
[self.imageView addConstraint:[NSLayoutConstraint constraintWithItem:self.imageView
attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual
toItem:self.scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0
constant:0]];
Para resumir, estoy intentando crear una funcionalidad similar a Photos.app.
Tengo un UIScrollView con un UIImageView dentro de él configurado en el Storyboard. El zoom funciona, pero tengo problemas para mantenerlo centrado. En todas las implementaciones de vistas de desplazamiento basadas en mi marco, lo he centrado de la siguiente manera, que funciona muy bien:
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
CGRect newImageViewFrame = self.imageView.frame;
// Center horizontally
if (newImageViewFrame.size.width < CGRectGetWidth(scrollView.bounds)) {
newImageViewFrame.origin.x = (CGRectGetWidth(scrollView.bounds) - CGRectGetWidth(self.imageView.frame)) / 2;
}
else {
newImageViewFrame.origin.x = 0;
}
// Center vertically
if (newImageViewFrame.size.height < CGRectGetHeight(scrollView.bounds)) {
newImageViewFrame.origin.y = (CGRectGetHeight(scrollView.bounds) - CGRectGetHeight(self.imageView.frame)) / 2;
}
else {
newImageViewFrame.origin.y = 0;
}
self.imageView.frame = newImageViewFrame;
}
Pero con Auto Layout no es para nada.
No tengo restricciones en UIScrollView o UIImageView, ya que no sé lo que deberían ser. Estoy pensando que debería pegar UIScrollView en las cuatro esquinas, pero para UIImageView no estoy del todo seguro, ya que el zoom cambia su fotograma.
Aquí hay un proyecto de ejemplo: http://cl.ly/21371H3q381N
¿Cómo haría para hacer zoom con el trabajo de centrado con diseño automático?
Para centrar los contenidos, puede tomar como referencia este fragmento de código:
// To re-center the image after zooming in and zooming out
- (void)centerScrollViewContents
{
CGSize boundsSize = self.bounds.size;
CGRect contentsFrame = self.imageView.frame;
if (contentsFrame.size.width < boundsSize.width)
{
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
}
else
{
contentsFrame.origin.x = 0.0f;
}
if (contentsFrame.size.height < boundsSize.height)
{
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
}
else
{
contentsFrame.origin.y = 0.0f;
}
self.imageView.frame = contentsFrame;
}
//for zooming in and zooming out
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
if (self.zoomScale > 1.0f)
{
[self centerScrollViewContents];
}
else
{
self.bouncesZoom = NO;
// for zooming out by pinching
[self centerScrollViewContents];
}
}
De esta manera, puede cambiar la posición de las coordenadas de una imagen después de acercar y alejar la imagen sin AutoLayout. Por favor, avíseme si ayuda. Gracias :)