Manish
Manish

Reputation: 722

How to get x and y position of UIImage in UIImageView?

I want to get original x and y position of UIImage when we set it in UIImageView with scaleAspectFill.

As we know in scaleAspectFill, some of the portion is clipped. So as per my requirement I want to get x and y value (it may be - value I don't know.).

Here is the original image from gallery

original image

Now I am setting this above image to my app view.

Clipped image in my view

So as above situation, I want to get it's hidden x, y position of image which are clipped.

Can any one tell how to get it?

Upvotes: 1

Views: 3023

Answers (4)

Parth Patel
Parth Patel

Reputation: 919

Use below extension to find out accurate details of Image in ImageView.

extension UIImageView {
    var contentRect: CGRect {
        guard let image = image else { return bounds }
        guard contentMode == .scaleAspectFit else { return bounds }
        guard image.size.width > 0 && image.size.height > 0 else { return bounds }

        let scale: CGFloat
        if image.size.width > image.size.height {
            scale = bounds.width / image.size.width
        } else {
            scale = bounds.height / image.size.height
        }

        let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
        let x = (bounds.width - size.width) / 2.0
        let y = (bounds.height - size.height) / 2.0

        return CGRect(x: x, y: y, width: size.width, height: size.height)
    }
}

How to test

let rect = imgTest.contentRect
print("Image rect:", rect)

Reference: https://www.hackingwithswift.com/example-code/uikit/how-to-find-an-aspect-fit-images-size-inside-an-image-view

Upvotes: 1

Bhavik Thummar
Bhavik Thummar

Reputation: 11

Try this Library ImageCoordinateSpace

I am not sure if it works for you or not, but it has a feature to convert CGPoint from image coordinates to any view coordinates and vice versa.

Upvotes: 0

AamirR
AamirR

Reputation: 12198

Use following extension

extension UIImageView {

    var imageRect: CGRect {
        guard let imageSize = self.image?.size else { return self.frame }

        let scale = UIScreen.main.scale

        let imageWidth = (imageSize.width / scale).rounded()
        let frameWidth = self.frame.width.rounded()

        let imageHeight = (imageSize.height / scale).rounded()
        let frameHeight = self.frame.height.rounded()

        let ratio = max(frameWidth / imageWidth, frameHeight / imageHeight)
        let newSize = CGSize(width: imageWidth * ratio, height: imageHeight * ratio)
        let newOrigin = CGPoint(x: self.center.x - (newSize.width / 2), y: self.center.y - (newSize.height / 2))
        return CGRect(origin: newOrigin, size: newSize)
    }

}

Usage

let rect = imageView.imageRect
print(rect)

UI Test

let testView = UIView(frame: rect)
testView.backgroundColor = UIColor.red.withAlphaComponent(0.5)
imageView.superview?.addSubview(testView)

Upvotes: 1

Atul Gupta
Atul Gupta

Reputation: 51

If you want to show image like it shows in gallery then you can use contraints "H:|[v0]|" and "V:|[v0]|" and in imageview use .aspectFit

And if you want the image size you can use imageView.image!.size and calculate the amount of image which is getting cut. In aspectFill the width is matched to screenwidth and accordingly the height gets increased. So I guess you can find how how much amount of image is getting cut.

Upvotes: 0

Related Questions