简体   繁体   English

如何以编程方式仅对6和6Plus设备启用横向定位?

[英]How to enable landscape orientation only for 6 and 6Plus device programmatically?

I am doing an iPhone project where i need to portrait and landscape support only for 6,6 Plus and iPad ? 我正在做一个iPhone项目,仅需要对6,6 Plus和iPad进行纵向和横向支持? Landscape won't work for iPhone 4,5 series. 风景不适用于iPhone 4,5系列。

How to do it programmatically in Objective c? 如何在目标c中以编程方式进行操作?

- (NSInteger)iPhoneType {

    struct utsname systemInfo;

    uname(&systemInfo);

    NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];

    if ([platform isEqualToString:@"iPhone1,1"]) return 1;//@"iPhone 2G";

    if ([platform isEqualToString:@"iPhone1,2"]) return 2;//@"iPhone 3G";

    if ([platform isEqualToString:@"iPhone2,1"]) return 3;//@"iPhone 3GS";

    if ([platform isEqualToString:@"iPhone3,1"]) return 4;//@"iPhone 4";

    if ([platform isEqualToString:@"iPhone3,2"]) return 4;//@"iPhone 4";

    if ([platform isEqualToString:@"iPhone3,3"]) return 4;//@"iPhone 4";

    if ([platform isEqualToString:@"iPhone4,1"]) return 5;//@"iPhone 4S";

    if ([platform isEqualToString:@"iPhone5,1"]) return 5;//@"iPhone 5";

    if ([platform isEqualToString:@"iPhone5,2"]) return 5;//@"iPhone 5";

    if ([platform isEqualToString:@"iPhone5,3"]) return 6;//@"iPhone 5c";

    if ([platform isEqualToString:@"iPhone5,4"]) return 6;//@"iPhone 5c";

    if ([platform isEqualToString:@"iPhone6,1"]) return 7;//@"iPhone 5s";

    if ([platform isEqualToString:@"iPhone6,2"]) return 7;//@"iPhone 5s";

    if ([platform isEqualToString:@"iPhone8,4"]) return 8;//@"iPhone SE";

    if ([platform isEqualToString:@"iPhone7,1"]) return 9;// @"iPhone 6 Plus";

    if ([platform isEqualToString:@"iPhone7,2"]) return 10;//@"iPhone 6";

    if ([platform isEqualToString:@"iPhone8,1"]) return 11;//@"iPhone 6s";

    if ([platform isEqualToString:@"iPhone8,2"]) return 12;//@"iPhone 6s Plus";

    if ([platform isEqualToString:@"iPhone9,1"]) return 13;//@"iPhone 7";

    if ([platform isEqualToString:@"iPhone9,2"]) return 14;//@"iPhone 7 Plus";

    if ([platform isEqualToString:@"iPod1,1"])   return 15;//@"iPod Touch 1G";

    if ([platform isEqualToString:@"iPod2,1"])   return 16;//@"iPod Touch 2G";

    if ([platform isEqualToString:@"iPod3,1"])   return 17;//@"iPod Touch 3G";

    if ([platform isEqualToString:@"iPod4,1"])   return 18;//@"iPod Touch 4G";

    if ([platform isEqualToString:@"iPod5,1"])   return 19;//@"iPod Touch 5G";

    if ([platform isEqualToString:@"iPad1,1"])   return 20;//@"iPad 1G";

    if ([platform isEqualToString:@"iPad2,1"])   return 21;//@"iPad 2";

    if ([platform isEqualToString:@"iPad2,2"])   return 22;//@"iPad 2";

    if ([platform isEqualToString:@"iPad2,3"])   return 23;//@"iPad 2";

    if ([platform isEqualToString:@"iPad2,4"])   return 24;//@"iPad 2";

    if ([platform isEqualToString:@"iPad2,5"])   return 25;//@"iPad Mini 1G";

    if ([platform isEqualToString:@"iPad2,6"])   return 26;//@"iPad Mini 1G";

    if ([platform isEqualToString:@"iPad2,7"])   return 27;//@"iPad Mini 1G";

    if ([platform isEqualToString:@"iPad3,1"])   return 28;//@"iPad 3";

    if ([platform isEqualToString:@"iPad3,2"])   return 29;//@"iPad 3";

    if ([platform isEqualToString:@"iPad3,3"])   return 30;//@"iPad 3";

    if ([platform isEqualToString:@"iPad3,4"])   return 31;//@"iPad 4";

    if ([platform isEqualToString:@"iPad3,5"])   return 32;//@"iPad 4";

    if ([platform isEqualToString:@"iPad3,6"])   return 33;//@"iPad 4";

    if ([platform isEqualToString:@"iPad4,1"])   return 34;//@"iPad Air";

    if ([platform isEqualToString:@"iPad4,2"])   return 35;//@"iPad Air";

    if ([platform isEqualToString:@"iPad4,3"])   return 36;//@"iPad Air";

    if ([platform isEqualToString:@"iPad4,4"])   return 37;//@"iPad Mini 2G";

    if ([platform isEqualToString:@"iPad4,5"])   return 38;//@"iPad Mini 2G";

    if ([platform isEqualToString:@"iPad4,6"])   return 39;//@"iPad Mini 2G";
    */
    if ([platform isEqualToString:@"i386"])      return 40;// @"iPhone Simulator";

    if ([platform isEqualToString:@"x86_64"])    return 41;//@"iPhone Simulator";

    return 0;

}

You can judge by this method. 您可以通过这种方法进行判断。

We have supportedInterfaceOrientationsFor method in UIApplicationDelegate so you can implement it and check device height condition and return required UIInterfaceOrientationMask like below 我们已经在UIApplicationDelegate supportedInterfaceOrientationsForUIApplicationDelegate方法,因此您可以实现它并检查设备高度条件并返回所需的UIInterfaceOrientationMask如下所示

Objective-C 目标C

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
   // iPhone 5 height:: 568 
    if ([[UIScreen mainScreen] bounds].size.height > 568) {
        return UIInterfaceOrientationMaskAll;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

Swift-3 斯威夫特3

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        // iPhone 5 height:: 568
        if UIScreen.main.bounds.height > 568 {
            return .all
        } else {
            return .portrait
        }
   }
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {
    if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) { 
         //For iPhone
         if ([[UIScreen mainScreen] bounds].size.height >= 568) {
            return UIInterfaceOrientationMaskPortrait;
         } else {
            return UIInterfaceOrientationMaskAll;
         }
    } else {
         //For iPad
         //your conditions for iPad 
         return UIInterfaceOrientationMaskAll
    }
}

Swift 3: 斯威夫特3:

I choose this way: 我选择这种方式:

I don'e have access to Xcode to write it in Objective-C. 我无权使用Xcode在Objective-C中编写它。 maybe I add Objective-C code later. 也许以后再添加Objective-C代码。

First determine device model name: 首先确定设备型号名称:

public extension UIDevice {

var modelName: String {
    var systemInfo = utsname()
    uname(&systemInfo)
    let machineMirror = Mirror(reflecting: systemInfo.machine)
    let identifier = machineMirror.children.reduce("") { identifier, element in
        guard let value = element.value as? Int8, value != 0 else { return identifier }
        return identifier + String(UnicodeScalar(UInt8(value)))
    }

    switch identifier {
    case "iPod5,1":                                 return "iPod Touch 5"
    case "iPod7,1":                                 return "iPod Touch 6"
    case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
    case "iPhone4,1":                               return "iPhone 4s"
    case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
    case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
    case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
    case "iPhone7,2":                               return "iPhone 6"
    case "iPhone7,1":                               return "iPhone 6 Plus"
    case "iPhone8,1":                               return "iPhone 6s"
    case "iPhone8,2":                               return "iPhone 6s Plus"
    case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
    case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
    case "iPhone8,4":                               return "iPhone SE"
    case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
    case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
    case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
    case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
    case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
    case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
    case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
    case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
    case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
    case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return "iPad Pro"
    case "AppleTV5,3":                              return "Apple TV"
    case "i386", "x86_64":                          return "Simulator"
    default:                                        return identifier
    }
}    
}

Then filter device orientation in AppDelegate: 然后在AppDelegate中过滤设备方向:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if  UIDevice.currentDevice().modelName == "iPhone 4"  ||
        UIDevice.currentDevice().modelName == "iPhone 5"  ||
        UIDevice.currentDevice().modelName == "iPhone 4s" ||
        UIDevice.currentDevice().modelName == "iPhone 5s" {

        return .portrait
    } else {
        return .all
    }
}

Check your device screen size is less than or equal to iPhone 5 screen size then support only Portrait mode. 检查设备屏幕尺寸是否小于或等于iPhone 5屏幕尺寸,然后仅支持纵向模式。 Else support all type orientation for higher screen size devices. 其他支持更高屏幕尺寸设备的所有类型方向。 Add this code in AppDelegate.m fil 在AppDelegate.m fil中添加此代码

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {

    CGSize screenSize = [[UIScreen mainScreen] bounds].size;

    if (screenSize.height <= 568.0) {
        // If the screen size is less than or equal to iPhone 5 screen size then only Portrait mode
        return UIInterfaceOrientationMaskPortrait;
    } else {
        // Else Support all the orientation. Even apple introduced new size screen devices, which is greater then iphone 5 screen size, then this will work.
        return UIInterfaceOrientationMaskAll;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM