2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ImageViewの画像サイズ処理 〜縮小させずに表示したい〜 

Posted at

とある開発中の一コマ

よし、じゃあここにUIImageViewを配置して…と
うんうん、正方形にしたいから縦横比は1:1に設定して
待って。。。画像が縮小されてる?!

スクリーンショット 2019-09-10 22.08.55.png
* ImageViewの背景色はグレーに設定してあります。

ImageViewには端から端まで画像をしっかり表示させたいですよね。
意外と情報が少なかったので忘備録として残しておきたいと思います。

1. scaleAspectFill

ImageViewのサイズの比率はそのままで、空白を作らず表示する。
縦長なら横幅、横長なら縦幅がImageViewぴったりになります。
画像の中心とImageViewの中心は同じで、はみ出た部分は表示されません。

ViewController.swift
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 
    }
}

スクリーンショット 2019-09-10 23.04.05.png

2. CGImage.cropping(to:)

ImageView目一杯というよりは切抜きです。

ViewController.swift
    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
        }
    }

スクリーンショット 2019-09-10 23.02.53.png

最後に

基本的には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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?