web-dev-qa-db-ja.com

Swift UIImageView Stretched Aspect

UIImageViewは、イメージのサイズを正しくレンダリングしません。 Scale Aspect Fitを使用して、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内の画像のレンダリング方法の2つの画像を添付しました。

ImageView with correct AspectImageView with wrong Aspect

24
George Grover

UIImageViewに自動サイズ変更マスクを追加すると、正しい比率が表示されるようになりました。

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

この答えは私を助けました: キャプチャされた写真はAVCaptureSession sessionPreset = AVCaptureSessionPresetPhotoで引き伸ばされます 私は携帯電話のカメラを通して撮影された画像を使用していました。

39
George Grover

Swiftコードのバージョン:

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

私は同じ問題を抱えていましたが、それを修正したのは、コンテンツモードが設定された後にimageViewイメージを設定することでした。すなわち:

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

乾杯

17
Paul G

これは、UIViewContentMode.ScaleAspectFitの意図された動作です。ドキュメントから:

UIViewContentModeScaleAspectFit

アスペクト比を維持して、ビューのサイズに合わせてコンテンツを拡大縮小するオプション。 ビューの境界の残りの領域は透明です。

あなたが説明することから、あなたはUIViewContentMode.ScaleAspectFillが必要だと思われます

UIViewContentModeScaleAspectFill

ビューのサイズに合わせてコンテンツを拡大縮小するオプション。コンテンツの一部は、ビューの境界を埋めるためにクリップされる場合があります。

6
Cezar

素晴らしい解決策があります here: 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)
    }

}
1
Hamid Hoseini