幅と高さが固定されたUIImageViewがあります。 UIImageViewのフレームを変更したくありません。アスペクト比を維持し、幅に合わせて画像を保持し、UIImageViewのフレームに対して画像を高すぎるか短すぎるようにします。このような:
赤はUIImageViewのフレームです。灰色は、表示されている実際の画像です。
それを行う最良の方法は、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
ビューのサイズに合わせてコンテンツを拡大縮小します。コンテンツの一部は、ビューの境界を埋めるためにクリップされる場合があります。
私はそれをテストしていませんが、頭のてっぺんからこれは正しいようです
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
}
画像のアスペクト比を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()
}
注:これはアスペクトフィット幅です