iphone - uiimageview set image swift
Cambiar el tamaño de UIImage y cambiar el tamaño de UIImageView (7)
Creo que lo que quieres es un content mode
diferente. Intente usar UIViewContentModeScaleToFill
. Esto escalará el contenido para adaptarse al tamaño de su UIImageView cambiando la relación de aspecto del contenido si es necesario.
Eche un vistazo a la sección de content mode
en el documento oficial para tener una mejor idea del modo de contenido diferente disponible (se ilustra con imágenes).
Tengo este UIImageView
y tengo los valores de su altura máxima y anchura máxima. Lo que quiero lograr es que quiero tomar la imagen (con cualquier relación de aspecto y resolución) y quiero que se ajuste a los bordes, de modo que la imagen no los exceda , pero puede reducirlos a su gusto. (marcado en rojo en la imagen):
En este momento, la imagen se ajusta al tamaño necesario correctamente, pero tengo 2 preocupaciones: 1. El UIImageView
no es igual al tamaño de la imagen redimensionada, por lo que deja un fondo rojo (y no quiero eso) 2. Si la imagen es más pequeña que la altura de mi UIImageView
no se redimensiona para ser más pequeña, se mantiene la misma altura.
Aquí está mi código y sé que está mal:
UIImage *actualImage = [attachmentsArray lastObject];
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;
Entonces, ¿cómo puedo cambiar dinámicamente el tamaño no solo de UIImageView.image
, sino de todo UIImageView
, haciendo que su tamaño sea totalmente ajustable a su contenido? Cualquier ayuda sería muy apreciada, gracias!
Cuando obtenga el ancho y el alto de una imagen redimensionada Obtenga el ancho de una imagen redimensionada después de UIViewContentModeScaleAspectFit , puede cambiar el tamaño de su imageView:
imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;
No he comprobado si funciona, pero creo que todo debería estar bien.
Este es el equivalente de Swift para la respuesta de Rajneesh071, usando extensiones
UIImage {
func scaleToSize(aSize :CGSize) -> UIImage {
if (CGSizeEqualToSize(self.size, aSize)) {
return self
}
UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0)
self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Uso:
let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
Si tiene el tamaño de la imagen, ¿por qué no establece que el frame.size
de frame.size
de la vista de la imagen sea de este tamaño?
EDITAR----
Ok, así que viendo tu comentario te propongo esto:
UIImageView *imageView;
//so let''s say you''re image view size is set to the maximum size you want
CGFloat maxWidth = imageView.frame.size.width;
CGFloat maxHeight = imageView.frame.size.height;
CGFloat viewRatio = maxWidth / maxHeight;
CGFloat imageRatio = image.size.height / image.size.width;
if (imageRatio > viewRatio) {
CGFloat imageViewHeight = round(maxWidth * imageRatio);
imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight);
}
else if (imageRatio < viewRatio) {
CGFloat imageViewWidth = roundf(maxHeight / imageRatio);
imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight);
} else {
//your image view is already at the good size
}
Este código cambiará el tamaño de su vista de imagen a su relación de imagen, y también posicionará la vista de imagen en el mismo centro que su posición "predeterminada".
PD: espero que estés configurando imageView.layer.shouldRasterise = YES
e imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
si está utilizando el efecto de sombra CALayer;) Mejorará en gran medida el rendimiento de su interfaz de usuario.
Utilice la siguiente categoría y luego aplique el borde de Cuarzo a su imagen:
[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];
La categoría: UIImage + AutoScaleResize.h
#import <Foundation/Foundation.h>
@interface UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize;
@end
UIImage + AutoScaleResize.m
#import "UIImage+AutoScaleResize.h"
@implementation UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
UIImage *sourceImage = self;
UIImage *newImage = nil;
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize) == NO)
{
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor)
{
scaleFactor = widthFactor; // scale to fit height
}
else
{
scaleFactor = heightFactor; // scale to fit width
}
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if (widthFactor > heightFactor)
{
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
}
else
{
if (widthFactor < heightFactor)
{
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
}
}
}
UIGraphicsBeginImageContext(targetSize); // this will crop
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
if(newImage == nil)
{
NSLog(@"could not scale image");
}
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}
@end
if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]])
{
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]];
UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
}
else
{
[cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
{
UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
// [tableView beginUpdates];
// [tableView endUpdates];
}];
}
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size
{
//avoid redundant drawing
if (CGSizeEqualToSize(originalImage.size, size))
{
return originalImage;
}
//create drawing context
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
//draw
[originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
//capture resultant image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return image
return image;
}