UIImagePickerController よもやま話 http://www.spookies.co.jp 草苅 景 [email_address]
はじめに
UIImagePickerController  とは <ul><li>iPhone  で、 Camera  で写真を撮ったり、 Photo Library  から写真を選択するためのクラス。 </li></ul><ul><li>非常に簡単に利...
実際の ソースコード
@interface CameraViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { UII...
#define SOURCETYPE  UIImagePickerControllerSourceTypeCamera (省略) if(![UIImagePickerController isSourceTypeAvailable:SOURCE...
UIImagePickerControllerSourceType
UIImagePickerControllerSourceType <ul><li>UIImagePickerControllerSourceTypeCamera </li></ul><ul><ul><li>Camera  で撮影。 </li>...
Photo Library Saved Photo Album
Camera
UIImagePickerControllerDelegate
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDicti...
UIImagePickerController  に茶茶を入れる
allowsImageEditing =NO
画像編集しない場合 <ul><li>UINavigationControllerDelegate  を実装。 </li></ul><ul><li>Camera, PhotoLibrary  共に表示をいじれる。 </li></ul>- (voi...
ToyCamera  っぽい カメラインターフェース を実現
ここを消したい
for (UIView* view in currentView.subviews) { NSLog(@&quot;view is a %@&quot;, [view description]); } ひたすら掘ります
その結果
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)vie...
allowsImageEditing = YES
こんな感じで 表示したい
いろいろやり方を考えた <ul><li>なんとか  allowsImageEditing  画面起動をハンドリングしたい。 </li></ul><ul><ul><li>方法を発見できず。 </li></ul></ul><ul><li>Photo...
最終的に行き着いたやり方
View  の時間監視
(省略) [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkView) userInfo:nil repeats:YES]; touchV...
- (void)checkView { UIView* temp; [touchView.superview sendSubviewToBack:touchView]; if ((temp = [self getViewFromArray:se...
- (UIView *)getViewFromArray:(NSArray*)viewArray num:(int)i { if([viewArray count] <= i) return nil; return [viewArray obj...
最後に
非公開 API を使えばもう少しいろいろできるみたいです。 興味がある方はそちらも調べてみて下さい。
ご静聴ありがとうございました!
Upcoming SlideShare
Loading in...5
×

UIImagePickerController よもやま話

19,686

Published on

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

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
19,686
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
51
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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. ご静聴ありがとうございました!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×