widok nakładki kamery-tylko do podglądu?

Zauważyłem, że w OS 3.1 można dodać Widok nakładki do selektora obrazu za pomocą

cameraOverlayView

Zauważyłem jednak, że dodawanie widoku za pomocą tej metody również wyświetla widok przez cały czas wyświetlania UIImagePicker, gdy chcę go pokazać tylko podczas etapu podglądu.

Czy istnieje sposób, aby to się stało tylko podczas podglądu? Nie chcę, aby było tam podczas animacji otwartej migawki, lub ekranu, który pyta, czy chcesz użyć obrazu lub / align = "left" /

Author: mac_55, 2010-01-17

4 answers

Wymyśliłem sposób na osiągnięcie pożądanego rezultatu, choć to trochę... to nie takie standardowe. :)

Chodzi o to, aby nieco zmienić kolejność wewnętrznych widoków w strukturze UIImagePickerController używa.

OK, więc tworzymy obiekt UIImagePickerController, inicjalizujemy go i dodajemy do niego widok nakładki. Proszę o uwagę! Obiekt UIView (UIImageView w przykładzie kodu) jest ukryty od samego początku. Nie przegap tego. Na koniec prezentujemy kontroler image picker jako widok modalny kontroler. Ten kod powinien być gdzieś w Twoim applicationDidFinishLaunching:, viewWillAppear: lub podobne odpowiednie metody uruchamiania.

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];

Przed zwolnieniem widoku nakładki (anImageView) tworzony jest NSTimer, inicjowany przez anImageView (NSTimer userInfo nieruchomości) i zaplanowane od razu. Oto metoda, którą wywołuje:

- (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];
    }
}

Całość NSTimer jest dodawana do przepływu, aby upewnić się, że zmiana kolejności pracy nastąpi dokładnie wtedy, gdy UIImagePickerController będzie całkowicie gotowy do tego.

To jest to. Informatyka działa, to nie jest standardowe, jest szorstkie i szybkie. Ponownie zachęcamy do optymalizacji i uczynienia go " prostszym "(o Proszę, moim celem było pokazanie ci drogi).
 17
Author: Ivan Karpan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 20:12:18

Chciałem tylko pokazać inną możliwość bez podpowiedzi. Są systemowe powiadomienia o zmianach w CameraPicker. Nie są one również udokumentowane (jako struktura subview). Więc one również mogą ulec zmianie. Ale dostajesz je.

Możesz się dla nich zarejestrować używając no name:

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

Dostajemy tu ciekawe (selfexplaining) powiadomienia:

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 

Możesz ich użyć, aby wywołać ukryty stan nakładek lub cokolwiek innego.

 18
Author: calimarkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 16:50:52

Właściwie to próbowałem zrobić to samo i natknąłem się na dużo prostsze robienie tego poprzez ten wpis na blogu: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0/

Ponieważ UIImagePickerController może wywołać UINavigatorControllerDelegate, metoda poniżej zostanie wywołana przed wyświetlaniem selektora obrazu.

Oto ważny kod:

 - (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];
}
Mam nadzieję, że to pomoże.
 6
Author: naragon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 19:04:17

Po zbudowaniu selektora dodaj nakładkę do selektora(selektor.cameraOverlayView = myView).

Nakładki nie będzie na zdjęciu. To jest tylko, jak mówi, widok nakładki.

Możesz usunąć widok nakładki przed zrobieniem zdjęcia (metodatakePicture) i dodać Widok ponownie w imagePickerController:didFinishPickingMediaWithInfo:

 -2
Author: diederikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 07:39:51