2014-10-16 85 views
1

我使用的代码显示了一个特定的xib文件,具体取决于设备,目前有3个xibs,一个用于iPhone4,一个用于iPhone5,另一个用于iPad。定义大于iPhone 6的屏幕尺寸?

自iOS8/iPhone 6以来,由于xib不知道要载入什么内容,所以该应用程序无法在高于5s的任何内容上运行;

- (IBAction)btnTapForStart:(id)sender { 

    fromOtherClass=YES; 

    if([[UIScreen mainScreen]bounds].size.height == 568) 
    { 
     PlayMusicViewController *pmvc = [[PlayMusicViewController alloc]initWithNibName:@"XibForIPhone5" bundle:[NSBundle mainBundle]]; 

     [self.navigationController pushViewController:pmvc animated:YES]; 

    } 
    else 
    { 
     PlayMusicViewController *pmvc = [[PlayMusicViewController alloc]init]; 

     [self.navigationController pushViewController:pmvc animated:YES]; 
    } 

    [appObject.audioPlayer stop]; 
} 

如果我改变的568更高,将工作的价值,但有没有办法结合起来,例如,高度为568或iPhone6大小或iPhone 6加上大小等?

+0

为什么你有多个xibs?只需使用一个用于所有设备(可能是iPad的第二个)。使用自动布局和约束来正确地确定所有尺寸和位置。 – rmaddy 2014-10-16 15:45:52

+1

我最初并没有编写代码,只是希望解决它,所以它适用于那些有应用程序并使用iPhone 6/6 Plus的人,我可以担心之后改进代码,但这是一个更紧急的解决方法。 .. 感谢谁标记了这个答案也... – user3355723 2014-10-16 15:52:17

+0

那么你的问题是什么?你想为iPhone 6使用iPhone 5 xib吗?还是你有另一个特定于iPhone 6的xib? – rmaddy 2014-10-16 15:53:58

回答

1

您可能应该使用像Maddy说的自动布局,但是如果您想让代码适用于特定设备,那么您可能需要实现此实用程序方法。然后,您可以根据需要创建尽可能多的xib,并将它们定位到特定设备。例如

if ([[Utilities deviceType] isEqualToString:@"iPhone Retina4"] || [[Utilities deviceType] isEqualToString:@"iPhone Retina35"]) { 
    -- do something specific for these phones 
} 

我把这个方法放在一个Utilities类中。

+ (NSString *)deviceType { 
    NSString *device = nil; 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    CGFloat deviceScale = [UIScreen mainScreen].scale; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     device = @"iPhone Classic"; // Just in case it doesn't make it through the conditionals 
     // Classic has a resolution of 480 × 320 
     if((screenSize.height == 480 || screenSize.width == 480) && deviceScale == 1.0f) { 
      device = @"iPhone Classic"; 
     // Retina has a resolution of 960 × 640 
     } else if((screenSize.height == 480 || screenSize.width == 480) && deviceScale == 2.0f) { 
      device = @"iPhone Retina35"; 
     // Retina 4" has a resolution of 1136 x 640 
     } else if (screenSize.height == 568 || screenSize.width == 568) { 
      device = @"iPhone Retina4"; 
     // iPhone 6 has a resolution of 1334 by 750 
     } else if (screenSize.height == 667 || screenSize.width == 667) { 
      device = @"iPhone 6"; 
     // iPhone 6 Plus has an actual size of 2208 × 1242 and resolution of 1920 by 1080 
     // Reported size is 736 x 414 
     } else if (screenSize.height == 736 || screenSize.width == 736) { 
      device = @"iPhone 6 Plus"; 
     } 

    } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     device = @"iPad Classic"; // Just in case it doesn't make it through the conditionals 
     if(deviceScale == 1.0f) { 
      device = @"iPad Classic"; 
     } else if (deviceScale == 2.0f) { 
      device = @"iPad Retina"; 
     } 
    } 
    //NSLog(@"The device is %@ scale is %f and the height is %f and width is %f", device, deviceScale, screenSize.height, screenSize.width); 

    return device; 
} 
+0

为什么你会在这里使用字符串?枚举会做。 – StilesCrisis 2014-10-16 16:01:14

+0

@StilesCrisis,我没有正式的语言培训,所以我的知识库中有很多漏洞。我对枚举的了解以及如何使用它们是最小的。 – JScarry 2014-10-17 14:39:18

0

我做了一些关于枚举的研究,他们很好。它们使代码更具可读性,但大多数情况下它们允许编译器帮助您键入并捕获错误。 Xcode会自动完成你的设备类型,并会给你错误:如果你尝试使用未定义的值,则使用未声明的标识符。这里的代码被重写为一个枚举。我用LF前缀了这些值,但是您应该使用适合您项目的内容。

这是我的头文件

// Devices as of Fall 2014 
typedef NS_ENUM(NSInteger, LFdeviceType) { 
    LFDeviceTypePhoneClassic, 
    LFDeviceTypePhoneRetina3_5, 
    LFDeviceTypePhoneRetina4, 
    LFDeviceTypePhone6, 
    LFDeviceTypePhone6Plus, 
    LFDeviceTypePadClassic, 
    LFDeviceTypePadRetina, 
}; 

而且这是在我的.m文件。

m+ (NSInteger)deviceType { 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    CGFloat deviceScale = [UIScreen mainScreen].scale; 
    LFdeviceType device = LFDeviceTypePhoneClassic; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     device = LFDeviceTypePhoneClassic; // Just in case it doesn't make it through the conditionals 
     // Classic has a resolution of 480 × 320 
     if((screenSize.height == 480 || screenSize.width == 480) && deviceScale == 1.0f) { 
      device = LFDeviceTypePhoneClassic; 
     // Retina has a resolution of 960 × 640 
     } else if((screenSize.height == 480 || screenSize.width == 480) && deviceScale == 2.0f) { 
      device = LFDeviceTypePhoneRetina3_5; 
     // Retina 4" has a resolution of 1136 x 640 
     } else if (screenSize.height == 568 || screenSize.width == 568) { 
      device = LFDeviceTypePhoneRetina4; 
     // iPhone 6 has a resolution of 1334 by 750 
     } else if (screenSize.height == 667 || screenSize.width == 667) { 
      device = LFDeviceTypePhone6; 
     // iPhone 6 Plus has an actual size of 2208 × 1242 and resolution of 1920 by 1080 
     // Reported size is 736 x 414 
     } else if (screenSize.height == 736 || screenSize.width == 736) { 
      device = LFDeviceTypePhone6Plus; 
     } 

    } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     device = LFDeviceTypePadClassic; // Just in case it doesn't make it through the conditionals 
     if(deviceScale == 1.0f) { 
      device = LFDeviceTypePadClassic; 
     } else if (deviceScale == 2.0f) { 
      device = LFDeviceTypePadRetina; 
     } 
    } 
    //NSLog(@"The device is %@ scale is %f and the height is %f and width is %f", device, deviceScale, screenSize.height, screenSize.width); 

    return device; 
} 

这样称呼它:

if (( [Utilities deviceType] == LFDeviceTypePhoneClassic 
     || [Utilities deviceType] == LFDeviceTypePhoneRetina3_5) && 
     numberOfFoilsOnScreen > 7) { 
     numberOfFoilsOnScreen = 7; 
}