2015-10-02 9 views
6

na moim iPhone app Mam to ograniczone do portretu tylko pod cele projektu rozmieszczenia informacjisupportedInterfaceOrientations wezwali wszystkich iPhone'ów wyjątkiem 6+

Jest jeszcze jedna strona, że ​​chcę tylko w krajobrazie i używam metody supportedInterfaceOrientations do uzyskania że.

Standardowa realizacja:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     return UIInterfaceOrientationMask.Landscape 
    } 

To działa doskonale na wszystkich urządzeniach iPhone i iOS w wersji z wyjątkiem iPhone 6+. Metoda supportedInterfaceOrientations nigdy nie jest wywoływana.

Nie mogę znaleźć żadnego powodu, dla którego może to mieć wpływ tylko na iPhone'a 6+, wszelkie wskazówki byłyby bardzo mile widziane.

+0

Właśnie utworzyłem pustą aplikację do pojedynczego widoku i zweryfikowałem, że 'supportedInterfaceOrientations()' zostało wywołane dla 6 i 6 Plus. Nie można od razu zobaczyć, jak kod byłby inny, chyba że kontroler widoku jest kontrolerem widoku podrzędnego na coś innego, jak nawigacja vc, split vc, pasek kart vc itd. W takim przypadku upewnij się, że kontroler widoku nadrzędnego również odpowiada, chciałby. Jedyną rzeczą, która różni się od 6 Plus z góry mojej głowy, jest możliwość korzystania z podzielonego widoku w krajobrazie. Może coś tam jest? –

+0

Najbardziej prawdopodobnym powodem jest to, że klasa wielkości dla iPhone'a 6+ będzie miała regularną szerokość, ale kompaktowa szerokość dla wszystkich innych iPhone'ów wyświetlanych w landscaoe. Jaki to jest kontroler: normalny kontroler widoku lub kontener. Jeśli jest on prezentowany modalnie, uważam, że należy użyć opcji preferred_nterfaceOrientationForPresentation' –

+0

Zgodnie z dokumentami, 'supportedInterfaceOrientations' będzie wywoływane tylko na kontrolerze widoku root lub na kontrolerach, które są prezentowane, aby zająć cały ekran. Jest więc szansa, że ​​kontroler, do którego to wprowadzasz, na iPhone 6+ nie spełnia kryteriów. Jaki to jest kontroler?Wydaje się, że powinieneś ogólnie zaimplementować 'supportedInterfaceOrientations' w głównych kontrolerach kontenerów, takich jak UINavigationController, UITabBarController i UISplitViewController. –

Odpowiedz

-1

Patrząc na this question, spróbuj ten fragment kodu:

- (NSUInteger) supportedInterfaceOrientations 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
    { 
    // iPhone 5S and below: 320x480 
    // iPhone 6: 375x667 
    // iPhone 6 Plus: 414x736 
    CGSize screenSize = [UIScreen mainScreen].bounds.size; 
    // The way how UIScreen reports its bounds has changed in iOS 8. 
    // Using MIN() and MAX() makes this code work for all iOS versions. 
    CGFloat smallerDimension = MIN(screenSize.width, screenSize.height); 
    CGFloat largerDimension = MAX(screenSize.width, screenSize.height); 
    if (smallerDimension >= 400 && largerDimension >= 700) 
     return UIInterfaceOrientationMask.Landscape; 
    else 
     return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); 
    } 
    else 
    { 
    // Don't need to examine screen dimensions on iPad 
    return UIInterfaceOrientationMask.Landscape; 
    } 
} 

-Herzbube

Brakuje oficjalnego API firmy Apple, jest to obejście, że mam wymyślić:

[ Kod]

Fragment po prostu zakłada, że ​​ekran o wymiarach powyżej pół-arbi Trójdrożnie wybrany rozmiar nadaje się do obrotu. Częściowo arbitralnie, ponieważ próg 400 x 700 zawiera iPhone'a 6 Plus, ale nie obejmuje iPhone'a 6.

Chociaż to rozwiązanie jest raczej proste, to podoba mi się właśnie z powodu braku wyrafinowania. Nie muszę dokładnie rozróżniać urządzeń, więc wszelkie sprytne rozwiązania, takie jak te w Jef's answer, są przesadzone dla moich celów.

Wszystko, co zrobiłem, to zmiana pierwszej i trzeciej wartości zwracanej z UIInterfaceOrientationMaskAll na UIInterfaceOrientationMask.Landscape.

+1

Przykro mi, ale może nie wyjaśniłem wystarczająco jasno pytania. Wiem, jak zaimplementować krajobraz dla konkretnego urządzenia. Problem polega na tym, że supportedInterfaceOrientations nie jest wywoływana na urządzeniach iPhone 6+. Jest to w 100% problem i nie można go wywoływać tylko na urządzeniach iPhone 6+. – JLoewy

+0

@JLoewy, nie testujesz żadnego rzeczywistego urządzenia? –

3

można spróbować ten kod działa dla mnie

// you have to import foundation 
import Foundation 

class YourViewController : UIViewController { 
    var device = self.platform() 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(true) 

    if device.lowercaseString.rangeOfString("iphone6plus") != nil { 
    supportedInterfaceOrientations() 
    } 

    } 

    // add this method to your view controller 
    func platform() -> String { 
      var sysinfo = utsname() 
      uname(&sysinfo) // ignore return value 
      return NSString(bytes: &sysinfo.machine, length: Int(_SYS_NAMELEN), encoding: 
       NSASCIIStringEncoding)! as String 
     } 

Należy pamiętać, że to nie będzie działać na symulatorze, ale będzie działać idealnie na rzeczywistym urządzeniu.

+0

gdzie jest ten kod? – JLoewy

+0

hej JLoewy redagowałem odpowiedź, mam nadzieję, że to wyjaśnia – OverD

Powiązane problemy