OS 3.1では、画像ピッカーにオーバーレイビューを追加できることに気づきました。
cameraOverlayView
ただし、このメソッドを使用してビューを追加すると、プレビュー段階でのみ表示したい場合に、UIImagePickerが表示されている間ずっとビューが表示されることにも気づきました。
これをプレビュー中にのみ発生させる方法はありますか?開いたシャッターアニメーションや、画像を使用するか再撮影するかを尋ねる画面には表示されたくありません。
OS 3.1では、画像ピッカーにオーバーレイビューを追加できることに気づきました。
cameraOverlayView
ただし、このメソッドを使用してビューを追加すると、プレビュー段階でのみ表示したい場合に、UIImagePickerが表示されている間ずっとビューが表示されることにも気づきました。
これをプレビュー中にのみ発生させる方法はありますか?開いたシャッターアニメーションや、画像を使用するか再撮影するかを尋ねる画面には表示されたくありません。
サブビューをいじることなく、別の可能性を示したかっただけです。CameraPicker の変更に関するシステム通知があります。それらも(サブビュー構造として)文書化されていません。したがって、それらも変更される可能性があります。しかし、あなたはそれらを手に入れます。
名前を使用せずに登録できます。
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil];
ここで興味深い (自明の) 通知を受け取ります。
PLCameraControllerPreviewStartedNotification
PLCameraViewIrisAnimationWillBeginNotification
PLCameraViewIrisAnimationDidEndNotification
Recorder_DidStartPreviewing
Recorder_SourceStarted
Recorder_WillCapturePhoto
Recorder_DidCapturePhoto
Recorder_PhotoStillImageSampleBufferReady
Recorder_DidStopPreviewing
_UIImagePickerControllerUserDidCaptureItem // Photo was taken, preview is shown
_UIImagePickerControllerUserDidRejectItem // Repeat was pressed, camera is shown again
これらを使用して、overlayviews の非表示状態などをトリガーできます。
私はあなたが望む結果を達成する方法を見つけましたが、それは少し... それほど標準的ではありません. :)
アイデアは、構造体が使用する内部ビューの順序を少し再配置することですUIImagePickerController
。
オブジェクトを作成してUIImagePickerController
初期化し、オーバーレイ ビューを追加します。注意してください!UIView
オブジェクト (コードUIImageView
例) は最初から隠されています。それをお見逃しなく。最後に、イメージ ピッカー コントローラーをモーダル ビュー コントローラーとして提示します。このコードは、メソッドを起動するのに適切なapplicationDidFinishLaunching:
、または同様の場所のどこかにある必要があります。viewWillAppear:
UIImagePickerController *anImagePickerController = [UIImagePickerController new];
anImagePickerController.delegate = self;
anImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]];
anImageView.frame = CGRectMake(0, 1, anImageView.image.size.width, anImageView.image.size.height);
anImageView.hidden = YES;
anImagePickerController.cameraOverlayView = anImageView;
[viewController presentModalViewController:anImagePickerController animated:NO];
[anImagePickerController release];
[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(timerFireMethod:)
userInfo:anImageView
repeats:YES];
[anImageView release];
オーバーレイ ビュー ( anImageView
) がリリースされる前に、NSTimer
が作成され、 anImageView
(NSTimer
userInfo
プロパティ) で初期化され、すぐにスケジュールされます。呼び出すメソッドは次のとおりです。
- (void)timerFireMethod:(NSTimer*)theTimer {
UIView *cameraOverlayView = (UIView *)theTimer.userInfo;
UIView *previewView = cameraOverlayView.superview.superview;
if (previewView != nil) {
[cameraOverlayView removeFromSuperview];
[previewView insertSubview:cameraOverlayView atIndex:1];
cameraOverlayView.hidden = NO;
[theTimer invalidate];
}
}
すべてNSTimer
がフローに追加され、UIImagePickerController
完全に準備が整ったときに並べ替え作業が正確に行われるようにします。
これです。それは機能しますが、標準的ではなく、ラフで迅速です。繰り返しますが、自由に最適化して「より正しく」してください(ああ、そうしてください、私の目的はあなたに道を示すことでした)。
実際、私は同じことをしようとしていましたが、次のブログ投稿を介して、はるかに簡単に行うことができました: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0 /
UIImagePickerController は UINavigatorControllerDelegate を呼び出すことができるため、イメージ ピッカーが表示される前に以下のメソッドが呼び出されます。
重要なコードは次のとおりです。
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
if (!viewController)
return;
UIView* controllerViewHolder = viewController.view;
UIView* controllerCameraView = [[controllerViewHolder subviews] objectAtIndex:0];
UIView* controllerPreview = [[controllerCameraView subviews] objectAtIndex:0];
[controllerCameraView insertSubview:self.overlayView aboveSubview:controllerPreview];
}
それが役立つことを願っています。
ピッカーを作成するときに、オーバーレイをピッカーに追加します (picker.cameraOverlayView = myView)。
オーバーレイは、撮影された写真には含まれません。それが言うように、それはオーバーレイビューです。
写真を撮る前にオーバーレイ ビューを削除し (takePicture
メソッド)、再度ビューを追加することができます。imagePickerController:didFinishPickingMediaWithInfo: