2013-04-08 9 views
7

Witam Próbuję replikować ten sam obrót, który można zobaczyć w aplikacji aparatu, gdy orientacja jest przesunięta do położenia poziomego. Niestety nie miałem szczęścia. Muszę ustawić to dla niestandardowego cameraOverlayView z UIImagePickerController.Replikacja rotacji aplikacji aparatu do krajobrazu IOS 6 iPhone

Od tego portretu (B są UIButtons)

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

W tym krajobrazie

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

Innymi słowy chciałbym przycisków, aby trzymać się oryginalnego portretu dołu i obracać w swoich ośrodkach. Używam Storyboard i Autolayout jest włączony. Każda pomoc jest bardzo doceniana.

+0

zadał to samo pytanie jakiś czas temu - http://stackoverflow.com/questions/15377120/uiimagepickercontroller-record-video-with-landscape-orientation niestety nadal nie ma dobrej odpowiedzi. –

+0

No cóż, mam problemy z więzami Autolayout w xcode, ale są one wyraźnie charakterystyczne dla zakotwiczenia elementów do bieżącego dna orientacji, a nie oryginalnego dna portretu. Moją kolejną próbą będzie próba ustawienia ograniczeń w czasie wykonywania za pomocą '- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) na InterInterOrientation duration: (NSTimeInterval) duration" Czy masz jakieś sugestie przez @Aarona? – pechar

Odpowiedz

15

OK, więc udało mi się to rozwiązać. Należy zwrócić uwagę na to, że klasa UIImagePickerController obsługuje tryb portretowy tylko zgodnie z Apple documentation.

Aby uchwycić obrót, tutaj willRotateToInterfaceOrientation jest bezużyteczny, więc musisz użyć notyfikacji. Także ustawianie ograniczeń autolayout w środowisku wykonawczym nie jest drogą do zrobienia.

W AppDelegate didFinishLaunchingWithOptions trzeba włączonych powiadomieniach obrotów:

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

W viewDidLoad sposobie cameraOverlayView UIViewController dodać następujące:

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

koniec dodać metodę orientationChanged: do cameraOverlay 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]; 
} 

Powyższy kod stosuje transformację obrotową na 2 UBuzjach, których używam w tym przypadku btnCancel i btnSnap. Daje to efekt Aparatu podczas obracania urządzenia. Nadal dostaję Ostrzeżenie w konsoli <Error>: CGAffineTransformInvert: singular matrix. nie wiem, dlaczego tak się dzieje, ale ma to coś wspólnego z widokiem z kamery.

Mam nadzieję, że powyższe pomaga.

+0

Dzięki. To naprawdę mi pomogło. – Zigglzworth

+0

Cieszę się, że to była pomoc! – pechar

Powiązane problemy