LoginSignup
27
25

More than 5 years have passed since last update.

SwiftでUIImagePickerControllerを使ってみた

Last updated at Posted at 2014-06-15

SwiftでUIImagePickerControllerを使ってみた

SwiftでUIKit使ってみようということで定番のカメラアプリをUIImagePickerControllerを使って作ってみました。サンプルのソースをgithubにあげました。SwiftCam

基本的にはObjective-Cで書く方法と同じなのですが、微妙に引数や型が違かったりしたので、そこはUIImagePickerControllerの元ファイルをたどって見てもらえばObjective-Cではこういう名前のメソッドだったけどSwiftではこう書いてねっていうのが英語で書いてあります。

使ってみて気付いたこと

カメラ起動のタイミング

Objective-Cの時と同様、imagePickerはviewDidAppearのタイミングでカメラを起動してやります。
viewDidLoadの中でself.presentViewController(imagePicker, animated: true, completion: nil)でカメラを起動しようとすると whose view is not in the window hierarchy! というエラーで怒られます。
調べたところ、このエラーはiOSのライフサイクルイベントが絡んでいる様です。自分もこれから調べたものを詳しく詳しく読んでみます。
とりあえずはviewDidAppearで起動してやればオーケー。

Selectorの指定の仕方

UIImageWriteToSavedPhotosAlbumメソッドのcompletionメソッドとしてimageDidFinishSavingWithErrorContextInfoメソッドを独自に用意して書きました。
その時UIImageWriteToSavedPhotosAlbumの中でSelectorの指定の仕方ってSwiftだとどうするんだろうと詰まりました。
結局のところソースの通りObjective-Cの時とそんな変わらず、複数の引数があったとしても

"関数名:仮引数:仮引数:"

のように書いて出来ました。
あとはNSErrorで書いていたところをNSErrorPointerで書けっていうのもほうほう、というところ。

その他気をつけたいこと

関数の中で関数を書いてもエラーが出ない

Objective-Cだと関数の中で関数を宣言して書くとかそもそも有り得なかったし気にもしていなかったところなんですが、Swiftだとそれが可能です。可能であるがゆえに気付かないでviewDidAppearの中でデリゲートメソッドを書いて「あれ、なんでここ通ってないの?」ってことになりました。
気をつけましょう。

追記2014.11.07

久々にUIImagePickerControllerを使おうとしたところ、

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

というエラーが出てきました。
調べているとiOS7に移行した際にも出たエラーのようで、iOSのバグのようです。
エラー文から察するに「ViewControllerのViewのロード前にModalでUIImagePickerControllerを呼び出そうとしている」ということだと思い、NSTimerでUIImagePickerControllerを遅延呼び出ししてみましたがそれでもエラーは出ました。

引き続き回避策を探していきます。

27
25
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
27
25