Камера наложения - просто для предварительного просмотра?
Я заметил, что в ОС 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: