とある開発中の一コマ
よし、じゃあここにUIImageViewを配置して…と
うんうん、正方形にしたいから縦横比は1:1に設定して
待って。。。画像が縮小されてる?!
ImageViewには端から端まで画像をしっかり表示させたいですよね。
意外と情報が少なかったので忘備録として残しておきたいと思います。
1. scaleAspectFill
ImageViewのサイズの比率はそのままで、空白を作らず表示する。
縦長なら横幅、横長なら縦幅がImageViewぴったりになります。
画像の中心とImageViewの中心は同じで、はみ出た部分は表示されません。
class ViewController: UIViewController {
@IBOutlet weak var landscapeImageView: UIImageView!
@IBOutlet weak var portraitImageView: UIImageView!
let landscapeImage: UIImage = UIImage(named: "landscapeImage")!
let portraitImage: UIImage = UIImage(named: "portraitImage")!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
landscapeImageView.image = landscapeImage
portraitImageView.image = portraitImage
landscapeImageView.contentMode = UIView.ContentMode.scaleAspectFill
portraitImageView.contentMode = UIView.ContentMode.scaleAspectFill
}
}
2. CGImage.cropping(to:)
ImageView目一杯というよりは切抜きです。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
cutImage(view: landscapeImageView, image: landscapeImage)
cutImage(view: portraitImageView, image: portraitImage)
}
func cutImage(view: UIImageView, image: UIImage) {
let width: CGFloat = image.size.width
let height: CGFloat = image.size.height
if width != height {
guard let cutImageRef: CGImage = image.cgImage?.cropping(to: CGRect(x: width/2, y: height/2, width: height, height: height))
else {
return
}
view.image = UIImage(cgImage: cutImageRef)
} else {
view.image = image
}
}
最後に
基本的にはscaleAspectFillを使うのが一番だと思います。
croppingはもう少し設定を加えてあげると、scaleAspectFillよりも柔軟な画像サイズ処理を行えそうです。
あとは、cropped(to:)というお仲間さんがいてそれも便利なんだとか。
↑リンク貼っておきます!
参考にしたサイト
SwiftにおけるUIImageView・contentMode 別の画像表示
https://developer.apple.com/documentation/coregraphics/cgimage/1454683-cropping
https://developer.apple.com/documentation/coreimage/ciimage/1437833-cropped