2015-04-16 13 views
8

Hej Stackoverflow Członkowie, może mógłbyś mi pomóc rozwiązać mój problem.Nie można uzyskaćInterfaceOrientationsForWindow do pracy z Swift 1.2

Problem polega na tym, że chcę zablokować orientację wszystkich kontrolerów UIView na "Portret", ale jeśli pojawi się MoviePlayer, powinien przełączyć się w tryb krajobrazu i cofnąć, jeśli odtwarzacz zniknie.

Do Swift 1.2 użyłem:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> UIInterfaceOrientationMask { 
//If the video is being presented, let the user change orientation, otherwise don't. 
if let presentedViewController = window.rootViewController?.presentedViewController? { 
    if (presentedViewController.isKindOfClass(MPMoviePlayerViewController) && !presentedViewController.isBeingDismissed()) { 
     return .AllButUpsideDown 
    } 
} 
return .Portrait 
} 

Z Swift 1,2 pewne rzeczy się zmieniły i tak skończyło się z następującego kodu:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { 
    //If the video is being presented, let the user change orientation, otherwise don't. 
    if let presentedViewController = window?.rootViewController?.presentedViewController { 
     if (presentedViewController.isKindOfClass(MPMoviePlayerViewController) && !presentedViewController.isBeingDismissed()) { 
      return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue) 
     } 
    } 
    return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
} 

Ale mój kod nie działa, film Gracz (XCDYoutube) jest zablokowany w trybie portretu. Orientacja urządzenia Ustawienia powinny być w porządku!

Z góry dziękuję za pomoc!

+0

mam dwa szybkie sugestie: 1. Upewnij się, że plik Info.plist dla twojego projektu nie zawiera klucza do obsługiwanej orientacji interfejsu, który wyklucza tryby krajobrazu. 2. Ustaw punkt przerwania na pierwszym wierszu instrukcji "if" w funkcji supportedInterfaceOrientationsForWindow, a następnie przechodź przez pojedynczy krok przez kod, aby zobaczyć, co się dzieje. – dean

+0

w następstwie komentarzy deanware - czy jesteś pewien, że trafiłeś w pułapkę? Zwracasz wartość int/not UIInterfaceOrientationMask. Czy spróbowałeś uaktualnić do opcji menu Szybka 1.2? – johndpope

+0

Po prostu próbowałem w nowym projekcie twojego kodu Swift 1.2 i działa dobrze. Aplikacja obraca się tylko podczas prezentacji MoviePlayera. Prawdopodobnie masz inny problem. Może XCDYoutube nie gra dobrze z iOS 8 i nie obraca się już? Staraj się zawsze zwracać wszystkie orientacje, aby sprawdzić, czy obraca się odtwarzacz filmów. – pteofil

Odpowiedz

3

Miałem podobną logikę do twojej, ale kończyło się powrotem wsparcie dla wszystkich orientacji.

return UIInterfaceOrientationMaskWszystko w appdelegate.

W zależności od tego, ile masz kontrolerów widoku, możesz utworzyć podklasę abstrakcyjną UIViewController i zwrócić tylko wsparcie dla Portrait /, a następnie zhakować swój kontroler widoku youtube, aby obsługiwał krajobraz.

  • (NSUInteger) supportedInterfaceOrientations { powrót UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; }
1

Właśnie miałem dokładnie ten sam problem. Znalazłem sposób aby to naprawić, docierając na szczyt stosu Kontroler:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { 
    //If the video is being presented, let the user change orientation, otherwise don't. 
    if var presentedViewController = window?.rootViewController?.presentedViewController { 
     // Get the controller on the top of the stack 
     while (presentedViewController.presentedViewController) != nil { 
      presentedViewController = presentedViewController.presentedViewController! 
     } 

     if (presentedViewController.isKindOfClass(MPMoviePlayerViewController) && !presentedViewController.isBeingDismissed()) { 
      return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue) 
     } 
    } 
    return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
} 

Można także spróbować wyświetlić typ presentedViewController aby mieć pewność, że to słuszna:

println("presentedViewController type: \(presentedViewController.dynamicType)") 
Powiązane problemy