2010-01-17 6 views
15

ich bemerkt habe, dass in O 3.1 Sie eine Überlagerungsansicht auf das Bild Picker mitKamera-Overlay-Ansicht - nur für die Vorschau?

cameraOverlayView 

jedoch hinzufügen kann, habe ich auch bemerkt, dass auch für die gesamte Zeit zeigt die Ansicht über dieses Verfahren eine Ansicht Hinzufügen Der UIImagePicker wird angezeigt, wenn ich ihn nur während der Vorschau anzeigen möchte.

Gibt es eine Möglichkeit, dies nur während der Vorschau zu machen? Ich möchte nicht, dass es während der Open-Shutter-Animation angezeigt wird, oder auf dem Bildschirm, der fragt, ob Sie das Bild verwenden oder wiederholen möchten.

+2

Hey mac_55! Ich wollte dich nur sanft daran erinnern, meine aktualisierte Antwort zu akzeptieren/kommentieren. –

Antwort

17

Ich habe herausgefunden eine Möglichkeit für Sie nehmen das gewünschte Ergebnis zu erzielen, wenn es etwas ist ... nicht so Standard. :)

Die Idee ist es, ein wenig die Reihenfolge der inneren Ansichten in der Struktur UIImagePickerController neu anzuordnen verwendet.

OK, also erstellen wir ein UIImagePickerController Objekt, initialisieren es und fügen eine Overlay-Ansicht hinzu. Dürfte ich um eure Aufmerksamkeit bitten! Das Objekt UIView (UIImageView im Beispielcode) ist von Anfang an ausgeblendet. Verpassen Sie das nicht. Schließlich präsentieren wir den Bilderwähler-Controller als Modal-View-Controller. Dieser Code sollte irgendwo in Ihrem applicationDidFinishLaunching:, viewWillAppear: oder ähnlichen geeigneten Startmethoden sein.

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

Vor der Überlagerungsansicht (anImageView) ein NSTimer freigegeben wird, wird erstellt, initialisiert mit anImageView (NSTimeruserInfo Eigentum) und sofort geplant. Hier ist die Methode ruft:

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

Die ganze NSTimer Sache der Strömung hinzugefügt wird, um sicherzustellen, dass die Umordnung Arbeit um genau passieren wird, wenn die UIImagePickerController völlig bereit sein wird, dafür.

Das ist es. Es funktioniert, es ist kein Standard, es ist grob und schnell. Wiederum kannst du es optimieren und es 'righter' machen (ach bitte, mein Ziel war es, dir den Weg zu zeigen).

+0

Ich habe überlegt, die Ansicht nach dem Ablauf eines Timers einzustellen, aber ich war mir nicht sicher, ob die Kamera immer die gleiche Zeit zum Laden benötigt - hängt nicht davon ab, wie viel Speicher gerade verwendet wird und auf welchem ​​Gerät läuft es? z.B. Auf einem 3GS wird es schneller geladen als auf einem 3G. –

+0

Hey mac_55, ich habe meine Lösung optimiert - jetzt funktioniert es perfekt (so perfekt wie eine Workaround-Lösung funktionieren kann). :) HTH –

+0

Sorry für die Verzögerung. Ich bin noch nicht dazu gekommen, dies zu testen, aber ich bin glücklich, es als die Antwort zu markieren. :) –

-2

Wenn Sie den Picker aufbauen, fügen Sie das Overlay dem Picker hinzu (picker.cameraOverlayView = myView).

Das Overlay wird nicht in der Aufnahme sein. Es ist nur, wie es heißt, eine Überlagerungsansicht.

Sie können die Überlagerungsansicht entfernen, bevor ein Bild (takePicture-Methode) und fügen Sie die Ansicht wieder in imagePickerController:didFinishPickingMediaWithInfo:

+0

Sorry, das ist nicht das, wonach ich suche. Ich möchte das Overlay nur vor dem Fotografieren anzeigen. Nicht während der Kamera-Auslöser animiert oder gefragt wird, ob Sie das aufgenommene Bild mögen –

+0

Wenn Sie das Overlay (picker.cameraOverlayView = nil) entfernen, bevor Sie takePicture aufrufen, ist das Overlay nicht vorhanden, wenn der Shutter animiert wird. – diederikh

+0

Aber wie zeige ich es auf dem Vorschaubildschirm? Habe ich recht, wenn ich annehme, dass takePhoto alles aufnimmt, was auf dem Vorschaubildschirm angezeigt wird? Aber ich möchte das Overlay auf dem Vorschaubildschirm anzeigen (bevor das Foto aufgenommen wird) * verwirrt * –

6

Eigentlich war ich versuche, das Gleiche zu tun und ich kam in einem viel einfacheren davon über diese Blog-Post zu tun: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0/

Da die UIImagePickerController eine UINavigatorControllerDelegate nennen können, wird das Verfahren unten vor dem Bild genannt Picker wird angezeigt.

Hier ist der wichtige Code:

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

Hoffnung, das hilft.

18

Ich wollte nur eine andere Möglichkeit ohne Subview fiddling zeigen. Es gibt Systembenachrichtigungen für die Änderungen in CameraPicker. Sie sind auch nicht dokumentiert (als Subview-Struktur). Sie unterliegen also auch Änderungen. ABER Sie bekommen sie.

Sie können für sie registrieren, keinen Namen verwenden:

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

wir einige interessante bekommen (selbsterklärender) Benachrichtigungen hier:

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 

Sie sie verwenden können, Ihre overlayviews versteckten Zustand oder irgendetwas auslösen sonst.

+0

Sie denken, Sie könnten Ihre App für die Verwendung dieser abgelehnt bekommen? –

+0

Nein, das sind nur Strings. Das sollte funktionieren. Aber ich habe es noch nicht getestet. – calimarkus

+1

Getestet, und ich konnte meine Vorschau erfolgreich so ändern, dass sie sich von meiner Kameraansicht unterscheidet, indem ich mich an die Meldung "_UIImagePickerControllerUserDidCaptureItem" festhalte. Ich habe bemerkt, dass weder PLCameraViewIrisAnimationWillBeginNotification noch PLCameraViewIrisAnimationDidEndNotification ausgelöst wurden (ich benutze iOS 6), also musste ich mit Benachrichtigungen umgehen, die diese Ereignisse betreffen, wie "Recorder_WillCapturePhoto" und "PLCameraControllerPreviewStartedNotification". – Christian

Verwandte Themen