iPad iOS7 - UIImagePickerController in UIPopoverController falsche Vorschaubild
Bin ich mit einer UIImagePickerController innerhalb einer UIPopoverController, die perfekt funktioniert mit iOS6. Mit iOS 7 die "Vorschau" - Bild, das gezeigt wird, um zu erfassen das Bild wird gedreht, aber wenn ich ein Bild es ist richtig gespeichert.
Dies ist, wie ich meine picker:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
(NSString *) kUTTypeImage,
nil];
imagePicker.allowsEditing = NO;
Und fügen Sie es zu einem popover-controller:
self.imagePickerPopOver = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
[self.imagePickerPopOver presentPopoverFromRect:CGRectMake(aPosViewA.x, cameraButton_y, 100.0, 30.0) inView:self.detailViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
Sind diese Berechnungen für die button-position in einem UIScrollView, um zu zeigen, das popover in der richtigen position:
presentPopoverFromRect:CGRectMake(aPosViewA.x, cameraButton_y, 100.0, 30.0)
Ich glaube nicht, dass das problem dort liegt, da habe ich ausprobiert mehrere Kombinationen.
Ich habe auch versucht das Bild in den Vollbild-Modus, aber die app ist nur erlaubt, verwenden Sie das Querformat. Wenn das Bild genommen wird, im portrait-Modus und die modal view geschlossen wird, bleibt die app im portrait-Modus als auch. Ich konnte nicht einen Weg finden, um zu verhindern, dass die UIImagePickerController zu wechseln, um portrait-Modus oder zu zwingen, die app wieder zum landscape-Modus, wenn der modal-Ansicht wurde abgewiesen.
UPDATE
Ich habe die Antwort von hier und kam ein Schritt weiter.
Gestalte ich die Ansicht nach dem erstellen der picker und vor dem anzeigen der popover :
switch ([UIApplication sharedApplication].statusBarOrientation) {
case UIInterfaceOrientationLandscapeLeft:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(M_PI/2);
break;
case UIInterfaceOrientationLandscapeRight:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(-M_PI/2);
break;
default:
break;
}
die funktioniert, solange ich don ' T turn around das iPad. Dafür bin ich der Registrierung für die Ausrichtung geändert-Ereignis:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
und ändern Sie den picker anzeigen:
- (void)orientationChanged:(NSNotification *)notification{
if (self.imagePicker) {
switch ([UIApplication sharedApplication].statusBarOrientation) {
case UIInterfaceOrientationLandscapeLeft:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(M_PI/2);
break;
case UIInterfaceOrientationLandscapeRight:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(-M_PI/2);
break;
default:
break;
}
}
}
VERBLEIBENDE PROBLEM:
Wie schrieb ich am Anfang, wenn das Bild aufgenommen wurde, war es richtig dargestellt annehmen oder es verwerfen. Dies ist jetzt verändert. Irgendwie muss ich wissen, Wann das Bild aufgenommen und transformiert es zurück.
Ja, das ist wirklich eine unangenehme hack und wahrscheinlich nicht funktionieren, mit dem nächsten iOS-Update. Hat jemand eine Idee wie man das umsetzen, dass ein sauberer Weg?
UPDATE 2
Das war zu böse, ich habe gefunden eine saubere Lösung, die löst mein problem aber ist nicht die Antwort auf die erste Frage in Bezug auf ein imagepicker in einem popover-controller, die nicht von Apple empfohlenen, aber erlaubt.
Ich habe Unterklassen jetzt die UIImagePickerController wie diese:
@implementation QPImagePickerController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
@end
und ich bin mit dem imagepicker im Vollbildmodus statt in einem popover. Bisher getestet in iOS7.
- Ich bin mit dem exakt gleichen problem. Ich kann nicht glauben, dass dies nicht eine weitere relevante Frage—wie wird es nicht brechen mehr apps?
- Genau das gleiche problem, das nicht behoben werden im nächsten update?
- Es sieht für mich das gleiche Problem betrifft die ios7 facebook-app, die über eine pop-up-Kamera.
- in iOS7 iPad im Querformat nur app iam immer "UIApplicationInvalidInterfaceOrientation', reason: 'Unterstützt Orientierungen hat keine gemeinsame Ausrichtung mit der Anwendung und shouldAutorotate kehrt JA'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die UIImagePickerController hat eine Eigenschaft namens cameraViewTransform. Die Anwendung eines CGAffineTransform diese verwandeln wird das Vorschau-Bild aber wird nicht wandeln das aufgenommene Bild wird somit korrekt erfasst. Ich habe das gleiche problem, das Sie beschreiben, und ich löste es (für iOS7) durch die Erstellung meiner Kamera-Steuerung und legen Sie Sie in einem popover wie folgt:
Ich auch das Bild skalieren, wenn in der Landschaft, so dass es füllt den Sucher mehr, als es sonst wäre. Meiner Meinung nach ist das alles ziemlich fies, aber ich werde hoffentlich in der Lage sein, um es zu entfernen, sobald iOS7.1 ankommt.
Ich habe eine andere Lösung gefunden, die behandelt den Fall, wo ein Gerät gedreht wird, während die UIIMagePickerView präsentiert auf der Antwort basiert Geselle zur Verfügung gestellt. Es behandelt auch den Fall, wenn die Ansicht gedreht wird von UIOrientationLandscapeRight/UIOrientationLandscapeLeft zurück zu UIOrientationPortrait.
Ich erstellt eine Unterklasse von UIImagePickerController:
Dann registriert es, um Benachrichtigungen zu erhalten, wenn das Gerät die Orientierung ändert:
Den Selektor fixCameraOrientation enthält Journeyman ' s code mit einem zusätzlichen Fall, verpackt in einem überprüfen, um sicherzustellen, dass der sourceType ist die Kamera:
Den wichtigen Fall hier ist der Fall wo das Gerät die Orientierung geht auf hochformat. Die overlay-Ansicht zurückgesetzt werden muss in diesem Fall. Es ist auch wichtig für die fixCameraOrientation-Selektor aufgerufen werden, nachdem die Bild-picker-Ansicht lädt, wenn das Gerät gedreht wird:
Ich hatte eine ähnliche situation in meiner app. Aber die Vorschau war rotierenden richtig in iOS7 und nicht in iOS8. Dieser code setzt Voraus, Sie haben mehr als eine Orientierung.
Die erste Sache ist, um eine Unterklasse
UIImagePickerController
.Ausgehend von der Spitze, hinzufügen
#import <AVFoundation/AVFoundation.h>
zu Ihr .m-Datei.Auch hinzufügen einer Eigenschaft zu speichern, die Sie zur ersten Orientierung
@property (nonatomic) UIInterfaceOrientation startingOrientation;
und ein anderes für eine Bedingung zu entfernen, clipping@property (nonatomic) BOOL didAttemptToRemoveCropping;
.Begriff waren zu hören, ein paar Benachrichtigungen.
UIApplicationDidChangeStatusBarOrientationNotification
ist natürlich zu hören, für die Drehung des Geräts.AVCaptureSessionDidStartRunningNotification
genannt wird, rechts, wenn die Kamera startet die Aufnahme.In der
-captureSessionDidStart:
eine Bedingung hinzufügen, um zu überprüfen, die Aussicht ist tatsächlich auf dem Bildschirm und stellen Sie sicher, dass die Kamera soll angezeigt werdenif (self.view.window && self.sourceType == UIImagePickerControllerSourceTypeCamera)
. Wenn ja, legen Sie die anfangs-Orientierungself.startingOrientation = [UIApplication sharedApplication].statusBarOrientation;
.In der
-statusBarOrientationDidChange:
hinzufügen der gleichen Bedingung wie oben, aber dieses mal, wenn wahr, wir werden aktualisieren Sie die Kamera-Transformation. Zuerst bekommen wir die offset-rotation, basierend auf der anfänglichen Drehung. Das ist notwendig, wenn Sie geben Sie dieUIImagePickerController
in Orientierungen, die anderen dann portrait.Nächste wir ' ll update der Kamera-Transformation mit der aktuellen rotation.
Und schließlich werden wir versuchen, das zu entfernen schwarzen Balken präsentiert, entweder in 90-Grad-Orientierung von der Orientierung ab. (Dies könnte nur ein iOS8-Problem.) In etwas mehr detail, wenn ich geben Sie die
UIImagePickerController
im portrait-Modus und dann drehen, um die Landschaft, es wird mit schwarzen Balken am oberen und unteren Rand der Vorschau. Die Lösung für diese nicht zu skalieren, sondern entfernen Sie das clipping ein superview. Wir brauchen Sie nur zu machen, dieser Versuch einmal, so prüfen Sie zunächst, ob wir genannt haben, diese code. Stellen Sie auch sicher, dass wir nur diesen code aufzurufen, wenn wir gedreht haben. Wenn die genannt werden in der ersten Orientierung ist es nicht gleich klappt.Schließlich in den code für
-findClippedSubviewInView:
wir eine Schleife durch alle Untersichten die Suche nach einem anzeigen mit.clipsToBounds = YES
. Wenn das ist wahr, wir machen eine weitere Bedingung, um zu überprüfen, einer seiner Vorfahren superviews korrekt ist.In der
-hasAncestorCameraView:
wir einfach eine Schleife, bis die superview-Kette und gibt true zurück, wenn eine der Klassen hatCameraView
im Namen.Das ist die Aufschlüsselung des Codes, hier ist es alles zusammen.
iPad mit Kamera - anzeigen nicht in einem popover. Stattdessen präsentieren Sie in einem modalen view-controller, wie auf dem iPhone. (zumindest ab iOS 7)