74893


UIImageの画像読み込みの際に`Bundle.main.path`で指定する`UIImage(contentsOfFile:)`かファイル名で指定する`UIImage(named:)`があると思うのですが、`UIImage(contentsOfFile:)`の方がうまく動作してくれません。  
メソッド`loadPhoto(name:)`のどこが間違えているのでしょうか？

[code]

    func loadImage(_ name: String) -> UIImage?{
        if let imagePath = Bundle.main.path(forResource: name, ofType: "png"){
            print("UIImage(contentsOfFile:)で画像生成しました")
            return UIImage(contentsOfFile: imagePath)!
        } else {
            print("UIImage(named:)で画像生成しました")
            return UIImage(named: name)!
        }
    }
    
[/code]

全体のコード

[code]

    import UIKit
    
    class ViewController: UIViewController {
        let imageView = UIImageView()
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
        @IBAction func tapButton() {
            if let image: UIImage = self.loadImage("Correct") {
                let width = self.view.frame.size.width
                let height = self.view.frame.size.height
                self.imageView.frame = CGRect(x:0, y:0, width: width/2, height: height/2)
                self.imageView.center = CGPoint(x: width/2, y: height/2)
                self.imageView.image = image
                
                self.view.addSubview(imageView)
            } else {
                print("画像が適用できません")
            }
        }
        
        func loadPhoto(_ name: String) -> UIImage?{
            if let imagePath = Bundle.main.path(forResource: name, ofType: "png"){
                print("UIImage(contentsOfFile:)で画像生成しました")
                return UIImage(contentsOfFile: imagePath)!
            } else {
                print("UIImage(named:)で画像生成しました")
                return UIImage(named: name)!
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-03-25T04:06:24.927
74881
2021-03-25T10:52:52.797
40856
question
swift
UIImageの画像読み込み【UIImage(contentsOfFile:)】が動作してくれない


まず、大前提として、

  1. `Bundle.path(forResource:ofType:)`でパスが取得できるのは、アプリケーションに「バンドル・リソース」として追加されているファイルだけです。

  2. `UIImage.init(contentsOfFile:)`で画像が読み出せるのは、アプリ実行時にファイルとして、アプリから読み出せる場所にあるファイルだけです。

「バンドル・リソース」として追加したい画像は、ドラッグ&ドロップなどでプロジェクトに追加してください。

  * Finderで画像のコピーのあるフォルダーを開いて、XcodeのProject navigator(画面左側)にドラッグするなどして、画像を追加してください。

[![Xcode画面](https://i.stack.imgur.com/OHHgz.png)](https://i.stack.imgur.com/OHHgz.png)

  * 追加された画像をFile inspector(画面右側)で **Target Membership** にチェックが入っているのを確認してください。

* * *

Assets.xcassets
の中身が、ビルドされた後にどんな形でアプリに組み込まれるのかは、実装上の詳細にあたる事柄で保証されていません。ネット上をよく探せばファイルとして読みだす方法が見つかるかもしれませんが、あまり積極的に利用しない方が良いでしょう。


CC BY-SA 4.0
2021-03-25T10:52:52.797
74893
2021-03-25T10:52:52.797
13972
74881
answer