Cree una UIImageView y su escala UIImage proporcionalmente sin relleno adicional.

Tengo una UIView que contiene un UIImageView. UIImageViews funciona como el logotipo de marca de la aplicación. Cuando giro el dispositivo, la UIView contenedora cambia de tamaño para corresponder a las proporciones de paisaje o retrato de la pantalla.

Lo que estoy tratando de lograr es tener la UIImageView escalada en consecuencia, manteniendo proporciones también en el margen izquierdo.

Este es el código real para el "banner" blanco superior:

UIView *topBanner = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, height_topBanner)]; [topBanner setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin)]; [topBanner setBackgroundColor:[UIColor whiteColor]]; topBanner.autoresizesSubviews = YES; // the logo UIImage *topBanner_logo = [UIImage imageNamed:@"logo.png"]; float logoAspectRatio = topBanner_logo.size.width/topBanner_logo.size.height; topBanner_logoView = [[UIImageView alloc] initWithFrame:CGRectMake(topBanner.frame.size.width/100*3, topBanner.frame.size.height/100*7, (topBanner.frame.size.height/100*86)*logoAspectRatio, topBanner.frame.size.height/100*86)]; [topBanner_logoView setImage:topBanner_logo]; topBanner_logoView.backgroundColor = [UIColor blueColor]; topBanner_logoView.contentMode = UIViewContentModeScaleAspectFit; [topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)]; [topBanner addSubview:topBanner_logoView]; [self.view addSubview:topBanner]; 

Este es mi punto de partida: iPad retrato en inicio:

Inicio en modo retrato

Esto es lo que sucede cuando lo rotulo en el paisaje: Modo horizontal después del inicio

Como puede ver, las proporciones del UIImage están bien, pero estoy obteniendo bordes adicionales (puse el color de background del UIImageView para resaltarlo) porque UIImageView se estira para seguir el cambio del tamaño de su contenedor y el UIImage se ajusta a UIImageView y se coloca en su centro.

Lo mismo, invertido, ocurre cuando inicio la aplicación directamente en modo horizontal: Inicio en modo horizontal

Luego lo giro:

modo retrato despues del arranque

… y obtengo el logotipo con bordes adicionales en la parte superior e inferior.

Veo que puedo escribir una function para recalcular cada tamaño en cada cambio de rotation, pero me pregunto si hay una manera de configurar el UIImageView y el UIImage para que funcione sin piratear los procedimientos de autoarreglo / cambio de tamaño de iOS . ¡Suena tan simple!

Ha configurado la máscara de cambio de tamaño automático a altura y ancho flexibles:

 [topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)]; 

Si no lo hace, el valor pnetworkingeterminado es que la vista no coincidirá con el tamaño y, por lo tanto, la image tampoco.

Creo que es debido a topBanner_logoView.contentMode = UIViewContentModeScaleAspectFit;

Pruebe topBanner_logoView.contentMode = UIViewContentModeCenter o topBanner_logoView.contentMode = UIViewContentModeLeft para evitar que la image de UIImageView cambie de tamaño (y obtenga relleno).

Si UIImageView cambia de tamaño, elimine la máscara de autorrealización.

Puede resolver esto al no usar UIViewContentModeScaleAspectFit , y en su lugar calcular la relación de aspecto de la image y usarla explícitamente para el ancho o alto basado en el otro (ancho o alto).

Por ejemplo, giro al paisaje, y por eso quiero que la altura sea del 80% de la vista.

  CGFloat w = logo.image.size.width; CGFloat h = logo.image.size.height; CGFloat a = w / h; CGFloat h_use = self.view.height *0.8; CGFloat w_use = h_use*a; 

Además, establezca el modo de contenido en UIViewContentModeScaleAspectFill lugar de establecer explícitamente la relación de aspecto.