Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UIImagePickerController よもやま話

20,847 views

Published on

「iPhone勉強会 at 京都」2008年12月13日の発表資料です。

Published in: Technology
  • Be the first to comment

UIImagePickerController よもやま話

  1. 1. UIImagePickerController よもやま話 http://www.spookies.co.jp 草苅 景 [email_address]
  2. 2. はじめに
  3. 3. UIImagePickerController とは <ul><li>iPhone で、 Camera で写真を撮ったり、 Photo Library から写真を選択するためのクラス。 </li></ul><ul><li>非常に簡単に利用できる。 </li></ul><ul><li>iPhone SDK が提供している、 Camera を使うための公式な唯一の手段。 </li></ul>
  4. 4. 実際の ソースコード
  5. 5. @interface CameraViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { UIImagePickerController* cameraController; } @property (nonatomic, assign) UIImagePickerController* cameraController; @end
  6. 6. #define SOURCETYPE UIImagePickerControllerSourceTypeCamera (省略) if(![UIImagePickerController isSourceTypeAvailable:SOURCETYPE]){ return; } cameraController = [[[UIImagePickerController alloc] init] retain]; cameraController.sourceType = SOURCETYPE; cameraController.delegate = self; cameraController.allowsImageEditing = NO; [self.view.superview addSubview:cameraController.view]; //[self presentModalViewController:cameraController animated:YES];
  7. 7. UIImagePickerControllerSourceType
  8. 8. UIImagePickerControllerSourceType <ul><li>UIImagePickerControllerSourceTypeCamera </li></ul><ul><ul><li>Camera で撮影。 </li></ul></ul><ul><li>UIImagePickerControllerSourceTypePhotoLibrary </li></ul><ul><ul><li>Photo Library から画像選択。 </li></ul></ul><ul><li>UIImagePickerControllerSourceTypeSavedPhotosAlbum </li></ul><ul><ul><li>SavedPhotoAlbum から画像選択。 </li></ul></ul>
  9. 9. Photo Library Saved Photo Album
  10. 10. Camera
  11. 11. UIImagePickerControllerDelegate
  12. 12. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo; { [picker release]; // 写真選択時の処理 } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [picker release]; // キャンセル時の処理 }
  13. 13. UIImagePickerController に茶茶を入れる
  14. 14. allowsImageEditing =NO
  15. 15. 画像編集しない場合 <ul><li>UINavigationControllerDelegate を実装。 </li></ul><ul><li>Camera, PhotoLibrary 共に表示をいじれる。 </li></ul>- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { // 画面カスタマイズコード }
  16. 16. ToyCamera っぽい カメラインターフェース を実現
  17. 17. ここを消したい
  18. 18. for (UIView* view in currentView.subviews) { NSLog(@&quot;view is a %@&quot;, [view description]); } ひたすら掘ります
  19. 19. その結果
  20. 20. - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { UIView* cameraView = [viewController.view.subviews objectAtIndex:0]; UIView* cropOverlay = [cameraView.subviews objectAtIndex:3]; UIView* imgView = [cropOverlay.subviews objectAtIndex:0]; UIView* lcdLayer = [cropOverlay.subviews objectAtIndex:1]; [imgView setHidden: YES]; [lcdLayer setHidden: YES]; }
  21. 21. allowsImageEditing = YES
  22. 22. こんな感じで 表示したい
  23. 23. いろいろやり方を考えた <ul><li>なんとか allowsImageEditing 画面起動をハンドリングしたい。 </li></ul><ul><ul><li>方法を発見できず。 </li></ul></ul><ul><li>PhotoLibrary 全体に View を載せて、自前判定。 </li></ul><ul><ul><li>キャンセルが押されたとき、スクロールされた場合などの処理が複雑。 </li></ul></ul><ul><li>PhotoLibrary の Photo 上に同じ大きさの透明な View を載せる。 </li></ul><ul><ul><li>Photo 1 つずつのオブジェクトまで辿りつけなかった。 </li></ul></ul>
  24. 24. 最終的に行き着いたやり方
  25. 25. View の時間監視
  26. 26. (省略) [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkView) userInfo:nil repeats:YES]; touchView = [[MyTouchView alloc] init]; touchView.frame = CGRectMake(0, 0, 320, 480); touchView.backgroundColor = [UIColor blueColor]; touchView.opaque = YES; touchView.alpha = 0.5; touchView.cameraviewcontroller = self; [self.view.superview addSubview:touchView]; [self.view.superview sendSubviewToBack:touchView]; }
  27. 27. - (void)checkView { UIView* temp; [touchView.superview sendSubviewToBack:touchView]; if ((temp = [self getViewFromArray:self.view.superview.subviews num:2]) != nil) { if((temp = [self getViewFromArray:temp.subviews num:0]) != nil) { if((temp = [self getViewFromArray:temp.subviews num:1]) != nil) { if(([[temp description] length] > 15) && ([[[temp description] substringToIndex:15] isEqualToString:@&quot;<PLCropOverlay:&quot;])) { [touchView.superview bringSubviewToFront:touchView]; } } } } }
  28. 28. - (UIView *)getViewFromArray:(NSArray*)viewArray num:(int)i { if([viewArray count] <= i) return nil; return [viewArray objectAtIndex:i]; }
  29. 29. 最後に
  30. 30. 非公開 API を使えばもう少しいろいろできるみたいです。 興味がある方はそちらも調べてみて下さい。
  31. 31. ご静聴ありがとうございました!

×