Камера наложения - просто для предварительного просмотра?

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

cameraOverlayView

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

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

Ответы

Ответ 1

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

Идея состоит в том, чтобы немного изменить порядок внутренних представлений в структуре 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 будет полностью готова к этому.

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

Ответ 2

Я просто хотел показать еще одну возможность без подзапроса. Существуют системные уведомления об изменениях в 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 или что-то еще.

Ответ 3

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

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

Ответ 4

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

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

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