web-dev-qa-db-ja.com

UIImageViewはアスペクト比を維持しますが、幅に合わせます

幅と高さが固定されたUIImageViewがあります。 UIImageViewのフレームを変更したくありません。アスペクト比を維持し、幅に合わせて画像を保持し、UIImageViewのフレームに対して画像を高すぎるか短すぎるようにします。このような:

UIImageView frame

赤はUIImageViewのフレームです。灰色は、表示されている実際の画像です。

10
SirRupertIII

それを行う最良の方法は、imageViewのモード(アスペクトフィル、アスペクト幅など)で遊ぶことだと思います。これは、画像の幅と高さの比率に基づいています。

if image.width > image.height {
    imageView.contentMode = UIViewContentModeScaleAspectFit
    //since the width > height we may fit it and we'll have bands on top/bottom
} else {
  imageView.contentMode = UIViewContentModeScaleAspectFill
  //width < height we fill it until width is taken up and clipped on top/bottom
}

UIViewContentModeScaleAspectFit

アスペクト比を維持することにより、ビューのサイズに合うようにコンテンツを拡大縮小します。ビューの境界の残りの領域はすべて透明です。

UIViewContentModeScaleAspectFill

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

私はそれをテストしていませんが、頭のてっぺんからこれは正しいようです

20
Glenn

Swift 5.1 iOS 1

私はコレクションビューのヘッダーセルにあったので、これが私のために働いたものです:

if headerCell!.imageView.frame.width > headerCell!.imageView.frame.height {
    headerCell!.imageView.contentMode = .scaleAspectFit
    //since the width > height we may fit it and we'll have bands on top/bottom
} else {
     headerCell!.imageView.contentMode = .scaleAspectFill
     //width < height we fill it until width is taken up and clipped on top/bottom
}
0
Marlhex

画像のアスペクト比をUIImageView自体のアスペクト比と比較する必要があると思います。

private func updateUI() {
    guard let image = image else { return }
    let viewAspectRatio = self.bounds.width / self.bounds.height
    let imageAspectRatio = image.size.width / image.size.height
    if viewAspectRatio > imageAspectRatio {
        self.contentMode = .scaleAspectFill
    } else {
        self.contentMode = .scaleAspectFit
    }
}

override var image: UIImage? { didSet { updateUI() }}

override func layoutSubviews() {
    super.layoutSubviews()
    updateUI()
}

注:これはアスペクトフィット幅です

0
Andy