はじめに
先日Twitterを眺めていたら、ふと気になる記事がアップされていました。
【swift】swiftでは実機でデバイスに保存した画像が表示されない - Documentsディレクトリ内の画像を読み込む方法【CoffeeNote開発日記】 - とつろぐ http://t.co/9xSKWuUxex #iPhoneアプリ開発
— iOS Dev Bot※Swift対応済 (@ios_dev_bot) 2014, 10月 19
これほんとー??
...と疑っていたのですが、何せブログ記事主の方への連絡方法が一切分からなかったので、こちらで適当に検証してみることにしました。
- 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)")
}
}
実行結果
撮影ボタンタップ
ログに保存先パスを出力していますが、ドキュメントフォルダ直下を指し示しています。
save: /var/mobile/Applications/(省略)/Documents/img1.jpg
ちゃんと読めていますね。
終わりに
iPadとiPhone両方で試しましたが、Swiftでも実機に写真を保存したり、それを読み込んだりということは問題なく動作しているように見えます。
少なくとも私の環境下では正常に動作しています。
もし特定の条件下で画像のロードに失敗するケースが本当にあるのでしたら、情報提供していただけると助かります。