Подтвердить что ты не робот

IPhone: получение размера изображения после AspectFt

Реальная нечетная, чтобы застрять, но странно я.

У вас есть imageView, содержащий изображение. Вы уменьшаете размер imageView вниз, а затем говорите ему, чтобы он использовал UIViewContentModeScaleAspectFit. поэтому ваш imageView может быть 300 на 200, но ваше масштабированное изображение внутри может быть 300 на 118 или 228 на 200, потому что его aspectfit.

Как вы получаете размер фактического изображения? imageView.image.size - размер исходного изображения.
imageview.frame - это рамка imageView не содержащегося изображения.
imageview.contentstretch тоже не работает

4b9b3361

Ответ 1

Я написал быструю категорию в UIImageView, чтобы добиться этого:

(. Ч)

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

(м.)

@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

Умножьте исходный размер изображения на заданный масштаб, и вы получите фактический размер отображаемого изображения.

Ответ 2

ну.. вам нужно сделать некоторую математику. у вас есть размер исходного изображения, и вы имеете размер изображения. Поэтому вы можете рассчитать, будет ли он изменяться по высоте или ширине.

если вы видите изображение размером 300x200, а изображение 1024x768, вы можете рассчитать, который является лимитирующим фактором

300/1024 = 0.29296875
200/768 = 0.260416667

так что высота является ограничивающим фактором... изображение будет:

267x200

Ответ 3

Быстрая версия принятого ответа:

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

Ответ 4

Просто добавьте небольшую защиту в код Individual11. При вызове imageScale на изображении без фактического изображения произойдет сбой.

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