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