create ios objective-c uiimageview uiimage

ios - create uiimageview programmatically swift 4



UIImageView ajuste de ajuste y centro (9)

Configurar el contentMode de imageView a UIViewContentModeScaleAspectFit fue suficiente para mí. Parece centrar las imágenes también. No estoy seguro de por qué otros usan lógica basada en la imagen. Ver también esta pregunta: ajuste de aspecto iOS y centro

Tengo una vista de imagen, declarada programáticamente, y estoy configurando su imagen, también mediante programación.

Sin embargo, no puedo configurar la imagen para que se ajuste al aspecto y alinee el centro con la vista de la imagen.

En otras palabras, quiero que la imagen:

  • Escala hacia abajo para adaptarse al aspecto, si la imagen es grande.
  • Centrar pero no ampliar, si la imagen es pequeña.

¿Cómo lo consigo?


En un lenguaje rápido, podemos configurar el modo de contenido de la vista de UIImage de la siguiente manera:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100)) newImgThumb.contentMode = .scaleAspectFit


Esta subclase utiliza el centro si la imagen no es más grande que la vista, de lo contrario, se reduce. Encontré esto útil para un UIImageView que cambia el tamaño.

La imagen que muestra es más pequeña que la vista para tamaños grandes, pero más grande que la vista para tamaños pequeños. Solo lo quiero escalar, pero no subir.

class CenterScaleToFitImageView: UIImageView { override var bounds: CGRect { didSet { adjustContentMode() } } override var image: UIImage? { didSet { adjustContentMode() } } func adjustContentMode() { guard let image = image else { return } if image.size.width > bounds.size.width || image.size.height > bounds.size.height { contentMode = .ScaleAspectFit } else { contentMode = .Center } } }


Para las personas que buscan el cambio de tamaño de UIImage,

@implementation UIImage (Resize) - (UIImage *)scaledToSize:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); [self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (UIImage *)aspectFitToSize:(CGSize)size { CGFloat aspect = self.size.width / self.size.height; if (size.width / aspect <= size.height) { return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)]; } else { return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)]; } } - (UIImage *)aspectFillToSize:(CGSize)size { CGFloat imgAspect = self.size.width / self.size.height; CGFloat sizeAspect = size.width/size.height; CGSize scaledSize; if (sizeAspect > imgAspect) { // increase width, crop height scaledSize = CGSizeMake(size.width, size.width / imgAspect); } else { // increase height, crop width scaledSize = CGSizeMake(size.height * imgAspect, size.height); } UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height)); [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } @end


Puede lograr esto estableciendo el modo de contenido de la vista de imagen en UIViewContentModeScaleAspectFill.

Luego use el siguiente método para obtener el objeto de uiimage redimensionado.

- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView { CGFloat width = imageToResize.size.width; CGFloat height = imageToResize.size.height; float scaleFactor; if(width > height) { scaleFactor = imageView.frame.size.height / height; } else { scaleFactor = imageView.frame.size.width / width; } UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0); [imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)]; UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; }

Editado aquí (Versión Swift)

func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage { let width = imageToResize.size.width let height = imageToResize.size.height var scaleFactor: CGFloat if(width > height) { scaleFactor = onImageView.frame.size.height / height; } else { scaleFactor = onImageView.frame.size.width / width; } UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0) imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)) let resizedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resizedImage; }


Resolví este problema así.

  1. setImage a UIImageView (con UIViewContentModeScaleAspectFit )
  2. obtener imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView cambiar el tamaño. [imageView sizeThatFits:imageSize]
  4. mueve la posición donde quieras.

Quería UIView para poner en el centro superior de UICollectionViewCell . entonces, usé esta función.

- (void)setImageToCenter:(UIImageView *)imageView { CGSize imageSize = imageView.image.size; [imageView sizeThatFits:imageSize]; CGPoint imageViewCenter = imageView.center; imageViewCenter.x = CGRectGetMidX(self.contentView.frame); [imageView setCenter:imageViewCenter]; }

Esto funciona para mi.


Solo pegando la solución:

Al igual que @manohar dijo

imageView.contentMode = UIViewContentModeCenter; if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) { imageView.contentMode = UIViewContentModeScaleAspectFit; }

resuelto mi problema


[your_imageview setContentMode:UIViewContentModeCenter];


let bannerImageView = UIImageView(); bannerImageView.contentMode = .ScaleAspectFit; bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);