2014-01-25 7 views
5

Ich verwende den UIImagePickerController mit einer benutzerdefinierten Kamera-Overlay-Ansicht und möchte eine benutzerdefinierte Schaltfläche hinzufügen, um den Blitzmodus zwischen Automatisch, An und Aus umzuschalten. Hier ist die Methode, die Taste ruft:Ändern des Blitzmodus mit einem benutzerdefinierten Kamera-Overlay

- (void)didTapFlash:(id)sender 
{ 
    if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeAuto) 
    { 
     [imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn]; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconOn.png"] forState:UIControlStateNormal]; 
    } 
    else if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeOn) 
    { 
     self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconOff.png"] forState:UIControlStateNormal]; 
    } 
    else if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeOff) 
    { 
     self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconAuto.png"] forState:UIControlStateNormal]; 
    } 
} 

Das Problem ist, das nicht funktioniert. Der Wert von self.imagePickerController.cameraFlashMode ändert sich nie, sobald der Controller angezeigt wird. Der Flash-Wert kann geändert werden, bevor er angezeigt wird, aber sobald dies der Fall ist, wird immer der Wert 0 (Auto) zurückgegeben. Der seltsame Teil ist, auch wenn der Wert nicht ändert, wird der Blitz verhält, als ob es tut so, wenn ich den obigen Code zu ändern:

- (void)didTapFlash:(id)sender 
{ 
    if (flashButton.tag == 0) 
    { 
     [imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn]; 
     self.flashButton.tag = 1; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconOn.png"] forState:UIControlStateNormal]; 
    } 
    else if (flashButton.tag == 1) 
    { 
     self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff; 
     self.flashButton.tag = -1; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconOff.png"] forState:UIControlStateNormal]; 
    } 
    else if (flashButton.tag == -1) 
    { 
     self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; 
     self.flashButton.tag = 0; 
     [self.flashButton setImage:[UIImage imageNamed:@"flashIconAuto.png"] forState:UIControlStateNormal]; 
    } 
} 

alles wie erwartet funktioniert. (der flashButton.tag speichert nur den Flash-Wert)

Weiß jemand, was hier passiert? Warum ist der Wert von cameraFlashMode immer 0 (sowohl in NSLog-Anweisungen als auch direkt beim Debugger), obwohl sich der Flash so verhält, als wäre er richtig eingestellt?

+0

Ich habe auch dieses Problem. Hast du dieses Problem gelöst? – hmlasnk

+0

Wenn Sie den Code aus dem zweiten Segment der Frage verwenden, funktioniert der Flash wie erwartet, aber der neue Wert wird nicht auf imagePickerController.cameraFlashMode aktualisiert, so dass der Wert an anderer Stelle gespeichert werden muss (im obigen Code habe ich ihn gespeichert Etikett). Ich weiß immer noch nicht den Grund dafür, warum es funktioniert. Ich nehme an, CameraFlashMode übergibt den neuen Wert nur an eine private Eigenschaft und wird zurückgesetzt. –

+1

Ich denke, iOS 7.1 hat einen Bug. Das ist die Sache für dieses Problem. Ich habe vorher überprüft, es ist mit iOS 7.0 und hat perfekt funktioniert. Aber arbeite nicht mit iOS 7.1. – hmlasnk

Antwort

1

Es scheint ein Fehler in neueste iOS-Version zu sein,

Sie werden feststellen, dass es mit der Aktivierung der Flagge

self.picker.showsCameraControls = true 

aber es zeigt die native Kamerasteuerung auf Ihre Overlay arbeiten, Also habe ich es mit diesem Code gehackt:

Es ist schnell genug, um den Benutzer nicht mit dem Anzeigen und Verbergen von Steuerelementen zu stören. Es funktionierte für mich und ich bin sicher, es wird auch in Ihrem Fall funktionieren!

Verwandte Themen