Comment détecter l'orientation de l'iPad dans l'extension du keyboard iOS8

Actuellement, j'utilise cette méthode pour détecter l'orientation et le périphérique:

Cela fonctionne pour les iPhones, mais c'est un problème avec l'iPad, quelle que soit l'orientation, les [[UIScreen mainScreen] bounds].size.width == 768, et les [[UIScreen mainScreen] bounds].size.height toujours == 1024. Quel est le problème avec mon encoding?

  +(NSSsortingng*)GetOrientation{ if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){ NSLog(@"Potrait"); return @"Potrait"; } else{ NSLog(@"Landscape"); return @"Landscape"; } } +(NSSsortingng*)GetDeviceAccordingToScreenSize:(UIViewController*)ctrl{ if ([[UIDevice currentDevice].model isEqualToSsortingng:@"iPad"]) { int screenWidth = [[UIScreen mainScreen] bounds].size.width; if (screenWidth==768) { return @"P-iPad"; }else if(screenWidth==1024){ return @"L-iPad"; }else{ return @"ERROR"; } }else{ if ([[self GetOrientation] isEqualToSsortingng:@"Potrait"]) { int screenHeight = [[UIScreen mainScreen] bounds].size.height; switch (screenHeight) { case 667:{ return @"P-iPhone6"; break; } case 736:{ return @"P-iPhone6Plus"; break; } case 568:{ return @"P-iPhone5"; } default:{ return @"P-iPhone4"; break; } } }else{ int screenWidth = [[UIScreen mainScreen] bounds].size.width; // float screenHeight = [[UIScreen mainScreen] bounds].size.height; switch (screenWidth) { case 667:{ return @"L-iPhone6"; break; } case 736:{ return @"L-iPhone6Plus"; break; } case 568:{ return @"L-iPhone5"; break; } default:{ return @"L-iPhone4"; break; } } } } } 

En passant, en extension, vous n'avez pas access à [UIApplication sharedApplication]

Vous devez utiliser nativeBounds au lieu de bounds pour vous assurer que le résultat ne dépend pas de l'orientation de l'application pendant son lancement.

 extension UIDevice{ var detail:Ssortingng { if iPhone { if UIScreen.mainScreen().nativeBounds.height == 480 { return "iPhone Classic" } if UIScreen.mainScreen().nativeBounds.height == 960 { return "iPhone 4 or 4S" } if UIScreen.mainScreen().nativeBounds.height == 1136 { return "iPhone 5 or 5S or 5C" } if UIScreen.mainScreen().nativeBounds.height == 1334 { return "iPhone 6" } if UIScreen.mainScreen().nativeBounds.height == 2208 { return "iPhone 6+" } } else if iPad { if UIScreen.mainScreen().nativeBounds.height == 1024 { return "iPad Classic" } if UIScreen.mainScreen().nativeBounds.height == 2048 { return "iPad Retina" } } else { return "Undefined" } return "test" } var iPhone:Bool { return UIDevice.currentDevice().userInterfaceIdiom == .Phone } var iPad:Bool { return UIDevice.currentDevice().userInterfaceIdiom == .Pad } var width:CGFloat{ return UIScreen.mainScreen().bounds.width } var landscape:Bool { if iPad && ( width == 1024.0 || width == 2048.0 ) { return true } if iPhone && ( width == 480.0 || width == 960 || width == 1136.0 || width == 1334.0 || width == 2208.0 ) { return true } return false } } if UIDevice().iPhone { println("This device is an iPhone") } if UIDevice().iPad { println("This device is an iPad") } println("Device detail: " + UIDevice().detail ) println("Landscape: " + UIDevice().landscape.description ) 

Hum, il y avait quelques changements avec iOS8, Maintenant [les limites d'UIScreen] est orientée interface Donc la largeur sera toujours 768.

Référence:

Est-ce que [UIScreen mainScreen] .bounds.size devient dépendante de l'orientation dans iOS8?

J'ai résolu ce problème moi-même, j'espère que cela aidera quelqu'un.

J'ai utilisé xib pour build l'interface du keyboard. Ce keyboard fonctionne à la fois sur iPhone et iPad, j'ai donc configuré 4 xibs (iPhone paysage, portrait, paysage iPad, portrait). J'ai oublié de désactiver les classs de taille pour les iPad. Après avoir désactivé cela, cela fonctionne parfaitement