Swift UIImageView Растянутый Аспект

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

//Image is Square & Correct Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 320))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

//Image is Rectangle & Incorrect Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 450))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

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

ImageView with correct AspectImageView with wrong Aspect

6 ответов


Я добавил маску автозапуска в UIImageView, и теперь она отображает правильные соотношения.

imageView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth
imageView.contentMode = UIViewContentMode.ScaleAspectFit

этот ответ помог мне: захваченная фотография растягивается с помощью AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto как я использовал изображение, которое было снято через камеру телефона.


Swift 3 версия код:

imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
imageView.clipsToBounds = true

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

    self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
    self.imageView.image = imageChosen

Ура


это предполагаемое поведение для UIViewContentMode.ScaleAspectFit. Из документов:

UIViewContentModeScaleAspectFit

возможность масштабирования содержимого размер представления, сохраняя соотношение сторон. все оставшиеся область границ вида прозрачна.

Кажется из того, что вы описываете, что вам нужно UIViewContentMode.ScaleAspectFill

UIViewContentModeScaleAspectFill

возможность масштабирование содержимого заполните размер представления. Часть содержимого может быть обрезана чтобы заполнить границы представления.


есть отличное решение здесь: by olearyj234 .
и это мне очень помогло. Предлагаю взглянуть. Кроме того, вот его код в swift 4 и Xcode 9.2:

    class ScaledHeightImageView: UIImageView {

    override var intrinsicContentSize: CGSize {

        if let myImage = self.image {
            let myImageWidth = myImage.size.width
            let myImageHeight = myImage.size.height
            let myViewWidth = self.frame.size.width

            let ratio = myViewWidth/myImageWidth
            let scaledHeight = myImageHeight * ratio

            return CGSize(width: myViewWidth, height: scaledHeight)
        }

        return CGSize(width: -1.0, height: -1.0)
    }

}

в Swift 4.1 и Xcode 9.3 вы можете использовать:

self.aboutImageView.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleBottomMargin.rawValue) | UInt8(UIViewAutoresizing.flexibleHeight.rawValue) | UInt8(UIViewAutoresizing.flexibleRightMargin.rawValue) |  UInt8(UIViewAutoresizing.flexibleLeftMargin.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue) | UInt8(UIViewAutoresizing.flexibleWidth.rawValue)))
    self.aboutImageView.contentMode = UIViewContentMode.scaleAspectFit

надеюсь, что это помогает