ios objective-c uiimageview uiimage

ios - uiimageview set image swift



UIImageView obtiene la posiciĆ³n de la imagen que muestra (4)

A continuación, responderá a su pregunta, suponiendo que su UIImageView usó UIViewContentModeAspectFit:

Debes considerar el tamaño de la imagen dentro de UIImageView. Esto depende de cómo establezca el modo de contenido. Según su descripción, supongo que está utilizando UIViewContentModeAspectFit. La imagen resultante también se centrará en UIImageView, por lo que también debe tener esto en cuenta para el cálculo.

-(CGRect )calculateClientRectOfImageInUIImageView:(UIImageView *)imgView { CGSize imgViewSize=imgView.frame.size; // Size of UIImageView CGSize imgSize=imgView.image.size; // Size of the image, currently displayed // Calculate the aspect, assuming imgView.contentMode==UIViewContentModeScaleAspectFit CGFloat scaleW = imgViewSize.width / imgSize.width; CGFloat scaleH = imgViewSize.height / imgSize.height; CGFloat aspect=fmin(scaleW, scaleH); CGRect imageRect={ {0,0} , { imgSize.width*=aspect, imgSize.height*=aspect } }; // Note: the above is the same as : // CGRect imageRect=CGRectMake(0,0,imgSize.width*=aspect,imgSize.height*=aspect) I just like this notation better // Center image imageRect.origin.x=(imgViewSize.width-imageRect.size.width)/2; imageRect.origin.y=(imgViewSize.height-imageRect.size.height)/2; // Add imageView offset imageRect.origin.x+=imgView.frame.origin.x; imageRect.origin.y+=imgView.frame.origin.y; return(imageRect); }

Para una mejor ilustración de las diferencias entre los tres modos de contenido, ver a continuación:

Tengo un UIImageView que muestra un UIImage.

El UIImage puede cambiar a otro UIImage en diferente tamaño, y la posición y el tamaño del UIImagem interior cambiará de acuerdo con él.

Mi problema es que intento agregar una vista que estará al final del UIImage (que cambia todo el tiempo) y todo lo que puedo obtener es el marco del UIImageView (que permanece en pantalla completa todo el tiempo).

¿Cómo puedo obtener el "marco" de la corriente que muestra UIImage?


Recomiendo usar la función incorporada AVMakeRectWithAspectRatio.

func AVMakeRectWithAspectRatioInsideRect(_ aspectRatio: CGSize, _ boundingRect: CGRect) -> CGRect

Parámetros:

aspectRatio:
La relación de ancho y alto (relación de aspecto) que desea mantener.

boundingRect: El rectángulo delimitador en el que desea encajar.

Valor devuelto Devuelve un CGRect escalado que mantiene la relación de aspecto especificada por aspectRatio que se ajusta dentro del Rect límite.

dejar boundingBox = AVMakeRectWithAspectRatioInsideRect (backgroundImage.size, frame)


Para Swift 3.0

// MARK: - Create Rect func calculateRectOfImageInImageView(imageView: UIImageView) -> CGRect { let imageViewSize = imageView.frame.size let imgSize = imageView.image?.size guard let imageSize = imgSize, imgSize != nil else { return CGRect.zero } let scaleWidth = imageViewSize.width / imageSize.width let scaleHeight = imageViewSize.height / imageSize.height let aspect = fmin(scaleWidth, scaleHeight) var imageRect = CGRect(x: 0, y: 0, width: imageSize.width * aspect, height: imageSize.height * aspect) // Center image imageRect.origin.x = (imageViewSize.width - imageRect.size.width) / 2 imageRect.origin.y = (imageViewSize.height - imageRect.size.height) / 2 // Add imageView offset imageRect.origin.x += imageView.frame.origin.x imageRect.origin.y += imageView.frame.origin.y return imageRect }

Para Swift <3.0

Este es el método anterior en Swift. De nuevo, suponiendo que contentMode se establece en .ScaleAspectFit Si no hay imagen en la imagen dada se imageView CGRectZero .

func calculateRectOfImageInImageView(imageView: UIImageView) -> CGRect { let imageViewSize = imageView.frame.size let imgSize = imageView.image?.size guard let imageSize = imgSize where imgSize != nil else { return CGRectZero } let scaleWidth = imageViewSize.width / imageSize.width let scaleHeight = imageViewSize.height / imageSize.height let aspect = fmin(scaleWidth, scaleHeight) var imageRect = CGRect(x: 0, y: 0, width: imageSize.width * aspect, height: imageSize.height * aspect) // Center image imageRect.origin.x = (imageViewSize.width - imageRect.size.width) / 2 imageRect.origin.y = (imageViewSize.height - imageRect.size.height) / 2 // Add imageView offset imageRect.origin.x += imageView.frame.origin.x imageRect.origin.y += imageView.frame.origin.y return imageRect }


Basado en la solución maravillosamente simple de Janusz, esto es lo que hice:

let visibleRect = AVMakeRect(aspectRatio: CGSize(width: image.size.width, height: image.size.height), insideRect: self.frame) if visibleRect.contains(point) { // Do something great here... }