iphone ios objective-c cocoa-touch uiimageview

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!



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; }