LoginSignup
23
22

More than 5 years have passed since last update.

SwiftでDocumentsディレクトリ内の画像が本当に読めないのか試してみた

Posted at

はじめに

先日Twitterを眺めていたら、ふと気になる記事がアップされていました。

これほんとー??
...と疑っていたのですが、何せブログ記事主の方への連絡方法が一切分からなかったので、こちらで適当に検証してみることにしました。

  • Xcode 6.0.1
  • iPad3 (iOS 8.0.2)
  • iPad Air (iOS 7.1.2)
  • iPhone6 Plus (iOS 8.0.2)

検証用の雑なコード

※エラーチェック等、全くやっていません。

import UIKit

class CameraTestViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    /// 画像ファイルの保存先パスを生成します(ドキュメントフォルダ直下固定)。
    var imagePath: String {
        let doc = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        return doc.stringByAppendingPathComponent("img1.jpg")
    }

    override func loadView() {
        super.loadView()

        addButton("Camera and Save", frame: CGRectMake(0, 0, 200, 100), sel: "cameraAndSave")
        addButton("Load Image", frame: CGRectMake(200, 0, 200, 100), sel: "loadImage")
    }

    /// ボタンを生成します。
    private func addButton(title: String, frame: CGRect, sel: Selector) {
        var btn = UIButton.buttonWithType(.System) as UIButton
        btn.frame = frame
        btn.exclusiveTouch = true
        btn.setTitle(title, forState: .Normal)
        btn.addTarget(self, action: sel, forControlEvents: .TouchUpInside)
        btn.layer.borderColor = UIColor.blackColor().CGColor
        btn.layer.borderWidth = 1
        self.view.addSubview(btn)
    }

    /// カメラ撮影ボタンが押された時に呼ばれます。
    func cameraAndSave() {
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .Camera
        presentViewController(picker, animated: true, completion: nil)
    }

    /// 画像読み込みボタンが押された時に呼ばれます。
    func loadImage() {
        let image = UIImage(contentsOfFile: imagePath)

        // 適当に表示します。
        let imageView = UIImageView(image: image)
        imageView.frame = CGRectMake(0, 150, 400, 400)
        self.view .addSubview(imageView)
    }

    // MARK: - UIImagePickerControllerDelegate

    /// カメラで写真を撮ってUse Photoボタンをタップされた後で呼ばれます。
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
        picker.dismissViewControllerAnimated(true, completion: nil)
        let image = info[UIImagePickerControllerOriginalImage] as UIImage
        let data = UIImageJPEGRepresentation(image, 0.9)
        data.writeToFile(imagePath, atomically: true)
        println("save: \(imagePath)")
    }
}

実行結果

  1. 起動直後:
    IMG_0028.PNG

  2. Camera and Saveボタンタップ後:
    IMG_0029.PNG

  3. 撮影ボタンタップ
    ログに保存先パスを出力していますが、ドキュメントフォルダ直下を指し示しています。

    save: /var/mobile/Applications/(省略)/Documents/img1.jpg

  4. Load Imageボタンタップ後:
    IMG_0030.PNG
    (UIImageViewのアス比の設定するの忘れてました)

ちゃんと読めていますね。

終わりに

iPadとiPhone両方で試しましたが、Swiftでも実機に写真を保存したり、それを読み込んだりということは問題なく動作しているように見えます。
少なくとも私の環境下では正常に動作しています。

もし特定の条件下で画像のロードに失敗するケースが本当にあるのでしたら、情報提供していただけると助かります。

23
22
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
23
22