¿Cómo puedo volver a ajustar mis imágenes para que sean proporcionales y se ajusten al cambio de orientación?

Cuando aparece una imagen en mi vista modal, quiero que la imagen se escale correctamente, así:

Si la vista es apaisada:

  • Si es una imagen horizontal, debe ajustarse a los límites de la pantalla.
  • Si es una imagen de retrato, debe centrarse

Si la vista es retrato

  • Si es una imagen vertical, ajuste el centro vertical
  • Lo mismo para la imagen horizontal

Tengo la vista de retrato bien porque uso la escala para ajustar el aspecto, lo que funciona muy bien en retrato

Sin embargo, no importa lo que haga, parece que no puedo hacer que las imágenes se escalen/cambien de tamaño/posicionen correctamente cuando cambio a paisaje.

Gracias de antemano.

 (void)viewDidLoad
  {

[super viewDidLoad];

self.scollView.delegate=self;

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];

[doubleTap setNumberOfTapsRequired:2];

[self.viewImage addGestureRecognizer:doubleTap];

}

- (void)resetContentMode:(UIImageView *)imageView
   {
   if (imageView.image == nil)
    return;

CGSize imageSize = imageView.image.size;
CGSize imageViewSize = imageView.bounds.size;

if (imageSize.height == 0 || imageViewSize.height == 0)
    return;

CGFloat imageRatio        = imageSize.width     / imageSize.height;
CGFloat imageViewRatio    = imageViewSize.width / imageViewSize.height;
CGFloat percentDifference = fabs(imageRatio - imageViewRatio) / imageViewRatio;

if (percentDifference < 0.25)
    imageView.contentMode = UIViewContentModeScaleAspectFill;
else
    imageView.contentMode = UIViewContentModeScaleAspectFit;
}






      -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer   shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer    *)otherGestureRecognizer

{ devuelve SÍ; }

 - (BOOL)shouldAutorotate {
  return YES;
  }

 - (NSUInteger)supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskAll;
  } 
          -(void)willAnimateRotationToInterfaceOrientation:     (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  {
       if(toInterfaceOrientation == UIInterfaceOrientationPortrait){
        [self resetContentMode:im];
    }
      else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight ||      toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {




        [self resetContentMode:im];
     }
  }


   - (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation {
[self.scollView setZoomScale:self.scollView.minimumZoomScale animated:YES];
if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
{

    [self resetContentMode:im];
}
   else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
{

     [self resetContentMode:im];

      }


   }
    - (void)orientationChanged:(NSNotification *)notification{
   [self adjustViewsForOrientation:[[UIApplication sharedApplication]    statusBarOrientation]];}

preguntado el 02 de diciembre de 13 a las 18:12

En realidad, este es el primer día de usar el objetivo c, es una extensión de una aplicación phonegap (la última que estoy aprendiendo de forma nativa), por lo que no sé cómo usar el diseño automático y qué hace. En cuanto al zoom de pellizco no. Y ya tengo implementado el doble toque para hacer zoom y ya funciona:

@Rob, ¿es más fácil usar el diseño automático? Si es así, ¿cómo puedo usarlo? -

1 Respuestas

Si no necesita pellizcar el zoom, sino simplemente ajustar la apariencia de la vista de la imagen en función de si la orientación de la imagen coincide con la vista de la imagen, puede retirar la vista de desplazamiento en este proceso.

Puede lograr el efecto deseado con solo una vista de imagen, pero cambiando el contentMode en función de lo cerca que esté la proporción de las dimensiones de la imagen de la proporción de dimensiones de la vista de la imagen. Si están cerca, usaré por defecto UIViewContentModeScaleAspectFill (y debido a que las proporciones son cercanas entre sí, no tengo que preocuparme de que se recorte demasiado). Si no están cerca, usaré por defecto UIViewContentModeScaleAspectFit (Debido a que las proporciones no están cerca, sé que se recortaría mucho si usara "rellenar", por lo que prefiero "ajustar").

- (void)resetContentMode:(UIImageView *)imageView
{
    if (imageView.image == nil)
        return;

    CGSize imageSize = imageView.image.size;
    CGSize imageViewSize = imageView.bounds.size;

    if (imageSize.height == 0 || imageViewSize.height == 0)
        return;

    CGFloat imageRatio        = imageSize.width     / imageSize.height;
    CGFloat imageViewRatio    = imageViewSize.width / imageViewSize.height;
    CGFloat percentDifference = fabs(imageRatio - imageViewRatio) / imageViewRatio;

    if (percentDifference < 0.25)
        imageView.contentMode = UIViewContentModeScaleAspectFill;
    else
        imageView.contentMode = UIViewContentModeScaleAspectFit;
}

Luego, cada vez que giro, vuelvo a llamar a este método. Por ejemplo:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self resetContentMode:self.imageView];
}

Yo tambien enciendo userInteractionEnabled en la imagen, y haz un gesto de doble toque que alterna entre los dos modos de contenido:

- (void)handleDoubleTap:(UITapGestureRecognizer *)gesture
{
    UIImageView *imageView = (id)gesture.view;

    if (imageView.contentMode == UIViewContentModeScaleAspectFit)
        imageView.contentMode = UIViewContentModeScaleAspectFill;
    else if (imageView.contentMode == UIViewContentModeScaleAspectFill)
        imageView.contentMode = UIViewContentModeScaleAspectFit;
    else
        [self resetContentMode:imageView];
}

También me aseguraré de que el UIImageView tiene su clipsToBounds establecido en SÍ, de modo que cuando esté usando UIViewContentModeScaleAspectFill, no tengo que preocuparme de que la imagen se derrame sobre el bounds de la vista de la imagen.

Esta es una solución rápida y sucia, pero funciona bastante bien para escenarios simples, en los que solo desea preocuparse por el ajuste de aspecto frente al relleno de aspecto.

Respondido el 03 de diciembre de 13 a las 15:12

¿Funcionará esto si pongo mi vista de imagen en una vista de desplazamiento y realizo el doble toque para hacer zoom? - Dnaso

@Dnaso Si el único propósito de la vista de desplazamiento era habilitar el doble toque, esto elimina por completo la necesidad de la vista de desplazamiento (y, de hecho, esto es incompatible con el doble toque de la vista de desplazamiento). Si necesita/quiere usar la vista de desplazamiento, lo anterior no funcionará. Es solo un algoritmo rápido y sucio que uso para determinar qué modo de contenido se usará al colocar la imagen en la vista de imagen. Si necesita la vista de desplazamiento, hágamelo saber. - Robar

No necesito necesariamente la vista de desplazamiento. Sin embargo, cuando solo estaba tocando dos veces y usando affline transforms es peculiar. al menos con una vista de desplazamiento, todo volvió a su lugar, por así decirlo. Soy desarrollador web, por lo que la estructura de objC es bastante diferente. .. solo para asegurarme de que estoy entendiendo esto: cuando cambio de orientación, tengo que volver a cargar las vistas correctamente y vuelve a dibujar todas mis vistas. - Dnaso

lo que realmente quiero lograr es lo siguiente... que la vista de mi imagen se ajuste a la pantalla o al menos se centre en el cambio de orientación según la orientación de la imagen. dos: quiero hacer doble toque zoom doble toque volver a la normalidad, lo que funciona ... lo único que no funciona es que las vistas se vuelvan a cargar y centren el contenido, lo cual es vergonzoso porque parece muy elemental: Dnaso

después de que descubrí los diseños automáticos funcionó, gracias - Dnaso

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.