如何在 iOS8 键盘扩展中检测 iPad 方向

How to detect iPad orientation in iOS8 keyboard extension

目前我正在使用这种方法来检测方向和设备:

它适用于 iPhone,但这是 iPad 的一个问题,无论方向是什么,[[UIScreen mainScreen] bounds].size.width始终 ==768,而 [[UIScreen mainScreen] bounds].size.height 始终 == 1024。什么是我的编码有问题吗?

 +(NSString*)GetOrientation{
    if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
        NSLog(@"Potrait");
        return @"Potrait";
    }
    else{
        NSLog(@"Landscape");
        return @"Landscape";
    }


}
+(NSString*)GetDeviceAccordingToScreenSize:(UIViewController*)ctrl{
    if ([[UIDevice currentDevice].model isEqualToString:@"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] isEqualToString:@"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;
                }
            }

        }

    }

}

顺便说一下,在扩展中您无权访问 [UIApplication sharedApplication]

嗯,iOS8 有一些变化, 现在 [UIScreen bounds] 是面向界面的 所以宽度总是768.

参考:

Is [UIScreen mainScreen].bounds.size becoming orientation-dependent in iOS8?

我自己解决了这个问题,希望对大家有所帮助。

我用xib搭建了键盘的界面。这个键盘 运行 在 iPhone 和 iPad 上都有,所以我设置了 4 个 xibs。(iPhone 横向,纵向,iPad 横向,纵向)。我忘记为 iPad 禁用大小 类。在我禁用它之后,它完美地工作

您应该使用 nativeBounds 而不是边界,以确保结果不依赖于应用程序启动时的设备方向。

extension UIDevice{
    var detail:String {
        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 )