Pregunta iOS: ¿puede estirar un UIImageView pero no un UIButton?


Mirad:

//UIImageView* stretchTest = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
//[self addSubview:stretchTest];


UIButton *stretchTest = [UIButton buttonWithType:UIButtonTypeCustom];
[stretchTest setFrame:CGRectMake(0, 0, 400, 100)];
[stretchTest setBackgroundImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
[self addSubview:stretchTest];

stretchTest.contentStretch = CGRectMake(0.5, 0.5, 0, 0);
stretchTest.contentMode = UIViewContentModeScaleToFill;

CGRect frame = stretchTest.frame;
frame.size.height = 300;
stretchTest.frame = frame;

Usando el UIImageView (comentado anteriormente), la imagen se estira apropiadamente. Las esquinas redondeadas mantienen el radio correcto, porque solo el píxel central de la imagen se estira.

Usando el botón UIB, la imagen se estira incorrectamente. Los radios de la esquina no se mantienen y se pone feo.

UIImageView y UIButton son subclases de UIView. ¿Por qué el botón cambia el tamaño de manera diferente que el imageView?


5
2018-02-23 01:25


origen


Respuestas:


Estás haciendo suposiciones sobre la forma en que funciona UIButton. No se implementa de la misma manera que UIImageView. UIImageView es solo una vista, sin subvistas, y su contenido es la imagen. UIButton es diferente, y la forma en que funciona es un detalle de implementación privada.

Si intenta estirar una imagen de forma adecuada en un botón, debe usar -[UIImage stretchableImageWithLeftCapWidth:topCapHeight:] para obtener un UIImage que sabe cómo se debe estirar. Si desea estirar solo el píxel medio, puede usar algo como

UIImage *image = [UIImage imageNamed:@"image.png"];
image = [image stretchableImageWithLeftCapWidth:floorf(image.size.width/2) topCapHeight:floorf(image.size.height/2)];

11
2018-02-23 01:34



UN UIButton tiene dos tipos de imágenes que puede mostrar: una imagen de primer plano y una de fondo. Se espera que la imagen de fondo de un botón reemplace la textura de fondo del botón. Como tal, se extenderá para llenar el fondo completo. Se espera que la imagen de primer plano del botón sea un ícono que puede o no mostrarse junto al texto; no se estirará Eso mayo reducir si el marco es más pequeño que la imagen, pero no se estirará.

El primer plano de un botón y la imagen de fondo se pueden configurar en un código como este:

// stretchy
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];  

// not stretchy
[self setImage:forgroundImage forState:UIControlStateNormal]; 

Por defecto, el backgroundImage de un botón utilizará scaleToFill para estirar la imagen. Sin embargo, si necesita que la imagen se estire utilizando inserciones de tapa, debe establecerlas en la imagen antes de asignarla a la imagen de fondo, como esto:

UIImage *image = [UIImage imageNamed:@"bg_image.png"];

/* This assumes your image will have a 1px column and 1px row of pixels 
   in the horizontal and vertical middle of the image that should be
   stretchable. If that's not the case (such as asymetrical buttons) 
   you need to adjust the caps */
image = [image stretchableImageWithLeftCapWidth:floorf(image.size.width/2)
               topCapHeight:floorf(image.size.height/2)];
[self setBackgroundImage:image forState:UIControlStateNormal];  

1
2017-10-30 19:10