2015-02-28 11 views
60

Pobrałem widok simpleCamera z kontroli kakao, które stosują tę metodę„interfaceOrientation” jest przestarzałe w iOS 8, Jak zmienić tę metodę Objective C

- (AVCaptureVideoOrientation)orientationForConnection 
{ 
    AVCaptureVideoOrientation videoOrientation = AVCaptureVideoOrientationPortrait; 
    switch (self.interfaceOrientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
      videoOrientation = AVCaptureVideoOrientationLandscapeLeft; 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      videoOrientation = AVCaptureVideoOrientationLandscapeRight; 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown; 
      break; 
     default: 
      videoOrientation = AVCaptureVideoOrientationPortrait; 
      break; 
    } 
    return videoOrientation; 
} 

problem jest „interfaceOrientation” przestarzałe w iOS 8, ale Nie wiem, jak i jak to zmienić w wariancie Switch.

+0

Dlaczego nie oznaczyć odpowiedzi z @cetcet jako poprawnej, chyba że znalazłeś lepszy sposób lub okazało się, że jest ona nieprawidłowa - wydaje mi się, że działa. –

+0

http://stackoverflow.com/a/3897243/194544 – beryllium

Odpowiedz

131

Ustalenie orientacji urządzenia jest nieprawidłowe. Na przykład urządzenie może być w trybie poziomym, ale kontroler widoku, który obsługuje tylko portret, pozostanie w pionie.

Zamiast korzystać z tego:

[[UIApplication sharedApplication] statusBarOrientation] 

Kolejnym bonusem jest to, że nadal używa enum UIInterfaceOrientation, więc bardzo mało kodu musi się zmienić.

+2

Nie działa w rozszerzeniach – jjxtra

+4

"statusBarOrientation" przestarzałe w iOS 9 - https://developer.apple.com/documentation/uikit/uiapplication/1623026-statusbarorientation?language = objc – Pang

2

Właściwość UIDevice nie jest poprawna (nawet jeśli może działać w większości przypadków) i może prowadzić do błędów, na przykład UIDeviceOrientation rozważ także orientację urządzenia, jeśli jest skierowana w górę lub w dół, jest brak pary w UIInterfaceOrientation wyliczając te wartości.
Ponadto, jeśli zablokujesz aplikację w określonej orientacji, UIDevice poda orientację urządzenia bez uwzględnienia tego.
Po drugiej stronie iOS8 wycofał właściwość interfaceOrientation na klasie UIViewController.
Istnieją 2 opcje dostępne do wykrywania orientacji interfejsu:

  • orientacji pomocą paska stanu
  • klas Wykorzystanie wielkości na iPhone, jeśli nie zostaną one nadpisane mogliby dać drogę do zrozumienia aktualnej orientacji interfejsu

Co jest nadal brakuje jest sposobem, aby zrozumieć kierunek zmiany orientacji interfejsu, który jest bardzo ważny podczas animacji.
W sesji WWDC 2014 "Podgląd kontrolera postępu w iOS8" głośnik zapewnia rozwiązanie tego problemu, używając metody, która zastępuje -will/DidRotateToInterfaceOrientation.

Oto proponowane rozwiązanie częściowo wdrożone:

-(void) viewWillTransitionToSize:(CGSize)s withTransitionCoordinator:(UIVCTC)t { 
    orientation = [self orientationFromTransform: [t targetTransform]]; 
    oldOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    [self myWillRotateToInterfaceOrientation:orientation duration: duration]; 
    [t animateAlongsideTransition:^(id <UIVCTCContext>) { 
     [self myWillAnimateRotationToInterfaceOrientation:orientation 
                duration:duration]; 
     } 
     completion: ^(id <UIVCTCContext>) { 
     [self myDidAnimateFromInterfaceOrientation:oldOrientation]; 
     }]; 
} 
+0

w jaki sposób orientationFromTransform: metoda wyprowadza orientację z transformacji? – Chandra

+1

@ Chris sprawdź tutaj http://blog.inferis.org/blog/2015/04/27/ios8-and-interfaceorientation/ – Andrea

18

Od systemów iOS 8, Apple zaleca stosowanie TraitCollections (rozmiar Classes) zamiast interfaceOrientation.

Co więcej, ponieważ iOS 9 i nowa funkcja iPada "Multitasking", istnieją przypadki, w których orientacja urządzenia nie pasuje do proporcji okna! (zerwanie interfejsu użytkownika aplikacji)

Powinieneś także zachować ostrożność podczas korzystania z klas o regularnym rozmiarze, ponieważ nie będzie to wymagało użycia całego ekranu iPada.

Czasami funkcja TraitCollections nie spełnia wszystkich Twoich potrzeb projektowych. Dla tych przypadków, Apple zaleca, aby porównać granic widok na:

if view.bounds.size.width > view.bounds.size.height { 
    // ... 
} 

Byłem bardzo zaskoczony, ale można sprawdzić na wideo Getting Started with Multitasking on iPad in iOS 9 WWDC 2015 na 21'15.

Może naprawdę szukasz orientacji urządzenia, a nie proporcji ekranu i okna. Jeśli zależy Ci na aparacie urządzenia, nie powinieneś używać TraitCollection, ani podglądać granic.

+0

Rzeczywiście wspomniano. Dzięki!! –

+0

Czy istnieje zalecany sposób sprawdzenia, czy urządzenie jest krajobrazowe w lewo czy w prawo? Naprawdę ma to znaczenie z wycięciem iPhone'a X :( –

+0

Możesz użyć opcji "[[UIDevice currentDevice]"), jeśli chcesz sprawdzić orientację urządzenia, ale nie powinieneś używać go do adaptacji iPhone'a X. Użyj nowego iOS 11 bezpieczny obszar lub stary margines ekranu. – vmeyer

Powiązane problemy