ios uibutton scale

ios - ¿Cómo escalo el imageView de UIButton?



scale (17)

Creé una instancia de UIButton llamada "botón" con una imagen usando [UIButton setImage:forState:] . El botón.frame es más grande que el tamaño de la imagen.

Ahora quiero escalar la imagen de este botón más pequeño. Traté de cambiar button.imageView.frame , button.imageView.bounds y button.imageView.contentMode , pero todos parecen ser ineficaces.

¿Alguien puede ayudarme a escalar un UIButton de UIButton?

UIButton el UIButton así:

UIButton *button = [[UIButton alloc] init]; [button setImage:image forState:UIControlStateNormal];

Traté de escalar la imagen de esta manera:

button.imageView.contentMode = UIViewContentModeScaleAspectFit; button.imageView.bounds = CGRectMake(0, 0, 70, 70);

y esto:

button.imageView.contentMode = UIViewContentModeScaleAspectFit; button.imageView.frame = CGRectMake(0, 0, 70, 70);


Storyboard

Debe definir una propiedad específica en Atributos de tiempo de ejecución de Identity inspector - imageView.contentModel , donde establece el valor relativo a la posición rawValue de enum UIViewContentMode . 1 significa scaleAspectFit .

Y la alineación de los botones, en el inspector de atributos :


Cada UIButton tiene una UIImageView oculta propia. Entonces, tenemos que configurar el modo de contenido como se muestra a continuación ...

[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit]; [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];


De una pequeña prueba que acabo de hacer después de leer aquí, depende si usa setImage o setBackgroundImage, ambos hicieron el mismo resultado y estiraron la imagen

//for setBackgroundImage self.imageButton.contentMode = UIViewContentModeScaleAspectFill; [self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal]; //for setImage self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; [self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];


Encontré esta solución.

1) Subclase los siguientes métodos de UIButton

+ (id)buttonWithType:(UIButtonType)buttonType { MyButton *toReturn = [super buttonWithType:buttonType]; toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit; return toReturn; } - (CGRect)imageRectForContentRect:(CGRect)contentRect { return contentRect; }

Y funciona bien


Esto también funcionará, ya que la imagen de fondo se escalará automáticamente

[button setBackgroundImage:image forState:UIControlStateNormal];


Extraño, el único combo que funcionó para mí (iOS 5.1) es ...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

y

[button setImage:newImage forState:UIControlStateNormal];



Me enfrenté a un problema similar, donde tengo una Imagen de fondo (una con borde) y una imagen (bandera) para un botón personalizado. Quería que la bandera se redujera y se centrara. Intenté cambiar el atributo de imageView pero no tuve éxito y estaba viendo esta imagen:

Durante mis experimentos, probé:

button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)

Logré el resultado esperado como:


No puedo obtener una solución que use _imageView, pero puedo usar un CGContextRef para resolverlo. Utiliza el UIGraphicsGetCurrentContext para obtener el actualContextRef y dibuja una imagen en currentContextRef, y luego escala o rota la imagen y crea una nueva. Pero no es perfecto.

el código:

-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height; { CGImageRef imgRef = photoimage.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); bounds.size.width = bounds_width; bounds.size.height = bounds_height; CGFloat scaleRatio = bounds.size.width / width; CGFloat scaleRatioheight = bounds.size.height / height; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = photoimage.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"]; break; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatioheight); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatioheight); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; }


Para el póster original, aquí está la solución que encontré:

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

Esto permitirá que su botón se escale horizontalmente. También hay una configuración vertical.

Me llevó varias horas averiguarlo (el nombre de la propiedad es muy poco intuitivo) así que imaginé que lo compartiría.


Solo hazlo (desde el diseño O desde el código):

Del diseño

  1. Abra su Xib O Storyboard.
  2. Seleccionar botón
  3. Inspector de atributos interno (lado derecho)> En la sección "Control" > seleccione la última opción 4 para Horizontal y Verical.

[Para el punto n. ° 3: Cambiar horizontal y vertical Alinear con UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]

Del código

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


Una forma adicional de configuración en el archivo XIB. Puede elegir esta opción si desea que el texto o la imagen sea Completar escala en UIButton. Será lo mismo con el código.

UIButton *btn = [UIButton new]; btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


como este puede resolver su problema:

+ (UIImage*)resizedImage:(UIImage*)image { CGRect frame = CGRectMake(0, 0, 60, 60); UIGraphicsBeginImageContext(frame.size); [image drawInRect:frame]; UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; }


utilizar

button.contentMode = UIViewContentModeScaleToFill;

no

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Actualizar:

Como @Chris comentó,

Para que esto funcione para setImage: forState :, debe hacer lo siguiente para escalar horizontalmente: myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;


En la esquina inferior izquierda de la captura de pantalla, puedes ver las propiedades de Estiramiento. Intenta usar esos.


UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)]; button.buttonType = UIButtonTypeCustom; UIImage *buttonImage = [UIImage imageNamed:@"image.png"]; UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0]; [button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal];


button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;