наложение камеры - только для предварительного просмотра? - PullRequest
15 голосов
/ 17 января 2010

Я заметил, что в OS 3.1 вы можете добавить вид наложения к средству выбора изображений с помощью

cameraOverlayView

Однако я также заметил, что добавление представления с помощью этого метода также отображает представление в течение всего времени отображения UIImagePicker, когда я хочу показать его только на этапе предварительного просмотра.

Есть ли способ сделать это только во время предварительного просмотра? Я не хочу, чтобы он был там во время анимации с открытым затвором или на экране, который спрашивает, хотите ли вы использовать изображение или повторно сделать его.

Ответы [ 4 ]

18 голосов
/ 17 января 2012

Я просто хотел показать еще одну возможность без возни с подпредставлением. В CameraPicker есть системные уведомления об изменениях. Они также не документированы (как структура подпредставления). Таким образом, они также могут быть изменены. НО ты их получаешь.

Вы можете зарегистрироваться для них без имени:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil];

Мы получаем несколько интересных (selfexplaining) уведомлений здесь:

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 

Вы можете использовать их, чтобы вызвать скрытое состояние ваших оверлеев или что-то еще.

17 голосов
/ 23 января 2010

Я нашел для вас способ достичь желаемого результата, хотя он немного ... не такой уж стандартный.:)

Идея состоит в том, чтобы немного изменить порядок внутренних представлений в структуре, используемой UIImagePickerController.

OK, поэтому мы создаем объект 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 будет полностью готов к этому.

Вот и все.Это работает, это не стандартно, это грубо и быстро.Опять же, не стесняйтесь оптимизировать и сделать это «правильным» (о, пожалуйста, моя цель состояла в том, чтобы показать вам путь).

6 голосов
/ 28 февраля 2010

На самом деле, я пытался сделать то же самое, и я наткнулся на гораздо более простую процедуру в этом сообщении в блоге: 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];
}

Надеюсь, это поможет.

0 голосов
/ 17 января 2010

Когда вы создаете сборщик, добавьте оверлей к нему (picker.cameraOverlayView = myView).

Наложение не будет на снимке. Это просто, как говорится, вид с наложением.

Вы можете удалить наложение перед съемкой (метод takePicture) и снова добавить представление в imagePickerController:didFinishPickingMediaWithInfo:

...