2013-04-08 20 views
7

Hallo Ich versuche, die gleiche Rotation zu replizieren, die in der Kamera-App angezeigt werden kann, wenn die Ausrichtung in Querformat verschoben wird. Leider hatte ich kein Glück. Ich muss dies für die benutzerdefinierte cameraOverlayView mit UIImagePickerController einrichten.Kamera-App-Rotation in Landscape IOS 6 replizieren iPhone

Von diesem Porträt (B sind UIButtons)

|-----------| 
|   | 
|   | 
|   | 
|   | 
|   |  
|   | 
| B B B | 
|-----------| 

Um diese Landschaft

|----------------| 
|    B | 
|    | 
|    B | 
|    | 
|    B | 
|----------------| 

Mit anderen Worten ich die Tasten, um das ursprüngliche Porträt unten halten möchten und drehen auf ihren Zentren. Ich verwende Storyboards und Autolayout ist aktiviert. Jede Hilfe wird sehr geschätzt.

+0

fragte die gleiche Frage einige Zeit vor - http://stackoverflow.com/questions/15377120/uiimagepickercontroller-record-video-with-landscape-orientation leider immer noch eine nette Antwort nicht hat. –

+0

Nun, ich habe mit Automatische Anordnung Einschränkungen in Xcode fummelte herum, aber sie sind eindeutig bestimmte Elemente der aktuellen Ausrichtung Boden zu verankern, statt der ursprünglichen Porträt unten. Mein nächstes wird versucht werden, um zu versuchen, die contraints zur Laufzeit mit dem 'set - (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation Dauer: (NSTimeInterval) duration' Haben Sie Anregungen obwohl @Aaron? – pechar

Antwort

15

OK, also habe ich es geschafft, dies zu sortieren. Zu beachten ist, dass die Klasse UIImagePickerController den Hochformatmodus nur gemäß Apple documentation unterstützt.

Um die Rotation zu erfassen, ist die willRotateToInterfaceOrientation hier nutzlos, Sie müssen also Meldungen verwenden. Auch das Festlegen von Einschränkungen bei der automatischen Layouteinstellung zur Laufzeit ist nicht der richtige Weg.

Im AppDelegate didFinishLaunchingWithOptions Sie aktiviert Rotation Benachrichtigungen müssen:

// send notification on rotation 
[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications]; 

In viewDidLoad Verfahren des cameraOverlayView UIViewController folgendes hinzufügen:

//add observer for the rotation notification 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

schließlich die orientationChanged: Methode zum cameraOverlay hinzufügen UIViewController

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    double rotation = 0; 

    switch (orientation) { 
     case UIDeviceOrientationPortrait: 
      rotation = 0; 
      break; 
     case UIDeviceOrientationPortraitUpsideDown: 
      rotation = M_PI; 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      rotation = M_PI_2; 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      rotation = -M_PI_2; 
      break; 
     case UIDeviceOrientationFaceDown: 
     case UIDeviceOrientationFaceUp: 
     case UIDeviceOrientationUnknown: 
     default: 
      return; 
    } 
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation); 
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.btnCancel.transform = transform; 
     self.btnSnap.transform = transform;  
    }completion:nil]; 
} 

Der obige Code wendet die Rotationstransformation auf die 2 UIButtons an, die ich in diesem Fall btnCancel und btnSnap verwende. Dadurch erhalten Sie beim Drehen des Geräts den Kamera-App-Effekt. Ich bin immer noch eine Warnung in der Konsole <Error>: CGAffineTransformInvert: singular matrix. nicht sicher, warum dies geschieht, aber es ist etwas mit der Kamera-Ansicht zu tun.

Hoffe, dass die oben hilft.

+0

Danke. Das hat mir wirklich geholfen. – Zigglzworth

+0

Ich bin froh, dass es hilfreich war! – pechar