Creé una instancia de UIButton llamada "botón" con una imagen usando [UIButton setImage:forState:]
. El button.frame es más grande que el tamaño de la imagen.
Ahora quiero reducir la escala de la imagen de este botón. He intentado cambiar button.imageView.frame
, button.imageView.bounds
y button.imageView.contentMode
, aunque todos parecen ineficaces.
¿Alguien puede ayudarme a escalar UIButton
el imageView de a?
Creé 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);
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 quedara en el centro. 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:
fuente
Una forma adicional para la configuración en el archivo XIB. Puede elegir esta opción si desea que el texto o la imagen sea Escalar relleno completo en UIButton. Será lo mismo con el código.
UIButton *btn = [UIButton new]; btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
fuente
utilizar
button.contentMode = UIViewContentModeScaleToFill;
no
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Actualizar:
Como comentó @Chris,
fuente
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];
fuente
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.
fuente
Extraño, el único combo que funcionó para mí (iOS 5.1) es ...
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
y
[button setImage:newImage forState:UIControlStateNormal];
fuente
Me acabo de encontrar con el mismo problema y hay una posible respuesta en esta pregunta:
¿Por qué una imagen de UIButton personalizada no cambia de tamaño en Interface Builder?
Esencialmente, use la propiedad backgroundimage en su lugar, que se escala.
fuente
Simplemente haga (desde el diseño o desde el código):
Desde Diseño
[Para el punto n. ° 3: cambie la alineación horizontal y vertical a
UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]
Desde Código
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
fuente
así 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; }
fuente
De una pequeña prueba que acabo de hacer después de leer aquí, depende de 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];
fuente
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
fuente
Esto también funcionará, ya que backgroundImage se escala automáticamente
[button setBackgroundImage:image forState:UIControlStateNormal];
fuente
Storyboard
Debe definir la propiedad específica de atributos de ejecución de inspector de Identidad -
imageView.contentModel
, donde se define el valor con relación arawValue
la posición de la enumeraciónUIViewContentMode
. 1 significa scaleAspectFit .Y la alineación del botón, en el inspector de atributos :
fuente
No puedo obtener una solución para _imageView, pero puedo usar una
CGContextRef
para resolverla. UtilizaUIGraphicsGetCurrentContext
para obtener currentContextRef y dibujar una imagen en currentContextRef, y luego escalar o rotar la imagen y crear una nueva imagen. 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; }
fuente
Espero que esto pueda ayudar a alguien más:
Swift 3+
button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill button.contentVerticalAlignment = UIControlContentVerticalAlignment.fill
fuente
Puede modificar imageView utilizando la clase personalizada de UIButton. Por favor vea mi respuesta. https://stackoverflow.com/a/59874762/5693826
fuente
Cada UIButton tiene una UIImageView oculta propia. Así que tenemos que configurar el modo de contenido como se indica a continuación ...
[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit]; [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
fuente
En la parte inferior izquierda de la captura de pantalla, puede ver Propiedades de estiramiento. Intente usar esos.
fuente