iPhone : Getting the size of an image after AspectFt

前端 未结 4 1574
天涯浪人
天涯浪人 2020-12-28 15:04

Real odd one to get stuck on but weirdly I am.

You you have a imageView containing a image. You size that imageView down and then tell it

相关标签:
4条回答
  • 2020-12-28 15:13

    well .. you have to do some math. you have the size of the original image and you have the size of the image view.. so you can calculate whether it will be resized by the height or the width.

    if you image view is 300x200 and the image is 1024x768 you can calculate which is the limiting factor

    300/1024 = 0.29296875
    200/768 = 0.260416667
    

    so the height is the limiting factor ... the image will be:

    267x200

    0 讨论(0)
  • 2020-12-28 15:17

    The Swift version of the accepted answer:

    extension UIImageView {
    var imageScale: CGSize {
        let sx = Double(self.frame.size.width / self.image!.size.width)
        let sy = Double(self.frame.size.height / self.image!.size.height)
        var s = 1.0
        switch (self.contentMode) {
        case .scaleAspectFit:
            s = fmin(sx, sy)
            return CGSize (width: s, height: s)
    
        case .scaleAspectFill:
            s = fmax(sx, sy)
            return CGSize(width:s, height:s)
    
        case .scaleToFill:
            return CGSize(width:sx, height:sy)
    
        default:
            return CGSize(width:s, height:s)
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-28 15:18

    Just adding a little security on Individual11 code. Calling imageScale on an imageView without an actual image would crash.

    extension UIImageView {
        var imageScale: CGSize {
    
            if let image = self.image {
                let sx = Double(self.frame.size.width / image.size.width)
                let sy = Double(self.frame.size.height / image.size.height)
                var s = 1.0
                switch (self.contentMode) {
                case .scaleAspectFit:
                    s = fmin(sx, sy)
                    return CGSize (width: s, height: s)
    
                case .scaleAspectFill:
                    s = fmax(sx, sy)
                    return CGSize(width:s, height:s)
    
                case .scaleToFill:
                    return CGSize(width:sx, height:sy)
    
                default:
                    return CGSize(width:s, height:s)
                }
            }
    
            return CGSize.zero
        }
    }
    
    0 讨论(0)
  • 2020-12-28 15:26

    I have written a quick category on UIImageView to achieve that:

    (.h)

    @interface UIImageView (additions)
    - (CGSize)imageScale;
    @end
    

    (.m)

    @implementation UIImageView (additions)
    - (CGSize)imageScale {
        CGFloat sx = self.frame.size.width / self.image.size.width;
        CGFloat sy = self.frame.size.height / self.image.size.height;
        CGFloat s = 1.0;
        switch (self.contentMode) {
            case UIViewContentModeScaleAspectFit:
                s = fminf(sx, sy);
                return CGSizeMake(s, s);
                break;
    
            case UIViewContentModeScaleAspectFill:
                s = fmaxf(sx, sy);
                return CGSizeMake(s, s);
                break;
    
            case UIViewContentModeScaleToFill:
                return CGSizeMake(sx, sy);
    
            default:
                return CGSizeMake(s, s);
        }
    }
    @end
    

    Multiply the original image size by the given scale, and you'll get your actual displayed image size.

    0 讨论(0)
提交回复
热议问题