UIImageView获取显示图像的位置

时间:2014-10-13 20:55:34

标签: ios objective-c uiimageview uiimage

我有一个显示UIImage的UIImageView。

UIImage可能会改变为不同大小的其他UIImage,内部UIImage的位置和大小会根据它而改变。

我的问题是我正在尝试添加一个将在UIImage结尾处的视图(它一直在变化),而我所能得到的只是UIImageView的框架(它一直保持全屏)

如何获得当前显示UIImage的“框架”?

5 个答案:

答案 0 :(得分:20)

以下将回答您的问题,假设您的UIImageView使用了UIViewContentModeAspectFit:

您必须考虑UIImageView中图像的图像大小。这取决于您设置contentMode的方式。根据您的描述,我假设您正在使用UIViewContentModeAspectFit。生成的图像也将在UIImageView中居中,因此您还必须考虑这一点进行计算。

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

为了更好地说明三种内容模式之间的差异,请参阅以下内容:

enter image description here

答案 1 :(得分:13)

Swift 4.2& 5.0

func calculateRectOfImageInImageView(imageView: UIImageView) -> CGRect {
        let imageViewSize = imageView.frame.size
        let imgSize = imageView.image?.size

        guard let imageSize = imgSize 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
    }

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
}

对于Swift< 3.0

这是Swift中的上述方法。同样,假设contentMode设置为.ScaleAspectFit如果给定的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
}

答案 2 :(得分:7)

我建议使用内置函数AVMakeRectWithAspectRatio。

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

<强>参数:

<强>的aspectRatio:
要保持的宽高比(宽高比)。

<强> boundingRect:     您想要适合的边界矩形。

返回值 返回一个缩放的CGRect,它保持由aspectRatio指定的宽高比,该宽高比适合于边界Rect。

让boundingBox = AVMakeRectWithAspectRatioInsideRect(backgroundImage.size,frame)

答案 3 :(得分:1)

基于Janusz非常简单的解决方案,这就是我所做的:

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

答案 4 :(得分:1)

Swift 3.0

我知道它已经很晚了但未来可能会对某人有所帮助。 iOS提供的非常简单和内置的解决方案。只需要:

import AVFoundation
let imageRect = AVMakeRect(aspectRatio: image.size, insideRect: self.imageView.bounds)