15

OS 3.1では、画像ピッカーにオーバーレイビューを追加できることに気づきました。

cameraOverlayView

ただし、このメソッドを使用してビューを追加すると、プレビュー段階でのみ表示したい場合に、UIImagePickerが表示されている間ずっとビューが表示されることにも気づきました。

これをプレビュー中にのみ発生させる方法はありますか?開いたシャッターアニメーションや、画像を使用するか再撮影するかを尋ねる画面には表示されたくありません。

4

4 に答える 4

19

サブビューをいじることなく、別の可能性を示したかっただけです。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 の非表示状態などをトリガーできます。

于 2012-01-17T16:50:52.673 に答える
18

私はあなたが望む結果を達成する方法を見つけましたが、それは少し... それほど標準的ではありません. :)

アイデアは、構造体が使用する内部ビューの順序を少し再配置することです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完全に準備が整ったときに並べ替え作業が正確に行われるようにします。

これです。それは機能しますが、標準的ではなく、ラフで迅速です。繰り返しますが、自由に最適化して「より正しく」してください(ああ、そうしてください、私の目的はあなたに道を示すことでした)。

于 2010-01-23T12:56:04.810 に答える
6

実際、私は同じことをしようとしていましたが、次のブログ投稿を介して、はるかに簡単に行うことができました: 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];
}

それが役立つことを願っています。

于 2010-02-28T19:04:17.500 に答える
-2

ピッカーを作成するときに、オーバーレイをピッカーに追加します (picker.cameraOverlayView = myView)。

オーバーレイは、撮影された写真には含まれません。それが言うように、それはオーバーレイビューです。

写真を撮る前にオーバーレイ ビューを削除し (takePictureメソッド)、再度ビューを追加することができます。imagePickerController:didFinishPickingMediaWithInfo:

于 2010-01-17T17:52:17.977 に答える