为 iPhone 5 加载不同的 xib
Posted
技术标签:
【中文标题】为 iPhone 5 加载不同的 xib【英文标题】:Loading a different xib for the iPhone 5 【发布时间】:2012-10-02 09:59:58 【问题描述】:我的应用程序具有适用于 iPhone 5 的额外功能,并且我已经为它创建了一个带有 .xib 的单独类。我想检测屏幕高度(除非可以获取设备 ID/型号)并相应地加载不同的视图控制器。我试过这个:
- (IBAction)select:(id)sender
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
if (screenHeight == 960)
Selection *selectView =[[Selection alloc] initWithNibName:nil bundle:nil];
selectView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:selectView animated:YES];
else
Selection_5 *selectView =[[Selection_5 alloc] initWithNibName:nil bundle:nil];
selectView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:selectView animated:YES];
Selection 和 Selection_5 是两个不同的类,每个类都有不同的用户界面 xib。
【问题讨论】:
是的,它奏效了。我用 float screenHeight = [UIScreen mainScreen].bounds.size.height 这是帮你解决这个问题***.com/questions/13275144/… 【参考方案1】:首先,您不想按设备类型进行检查。新的 iPod touch(屏幕尺寸相同)或明年的 iPhone 会发生什么。
但我认为这里的问题是您正在根据实际的像素数检查屏幕尺寸 - 奇怪的是 - 这不是您想要的。请记住,在 Retina 屏幕上,一切都是“加倍”的。在 UI 中,您(大多数情况下)对所有内容使用“正常”大小,在这种情况下,是像素数的一半。
简而言之:检查屏幕高度是否为 480(正常)或 568(iPhone 5)。
【讨论】:
啊,我终于明白 568 所引用的内容了!我正在使用它为 4" 设备加载不同的 xib。【参考方案2】:试试http://github.com/erica/uidevice-extension/
[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
或者您可以像这样观看 screenHeight:
float screenHeight = [UIScreen mainScreen].bounds.size.height;
iPhone 5 高度为 568
如果你使用 .xib 加载,也许你会设置 nib:
[[Selection alloc] initWithNibName:@"here_is_nibname" bundle:nil];
【讨论】:
谢谢,使用 float screenHeight = [UIScreen mainScreen].bounds.size.height 有效。 在横向模式下我无法获得设备的确切宽度请任何人分享如何获得... 在横向中,您需要比较的不是高度 568,而是宽度 568。【参考方案3】:在我的应用程序中,我必须为 iPhone、iPhone5/iPod Touch 和 iPad 加载一个 .XIB 文件,为此,这是我使用的代码:
// If Iphone/iPod Touch
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
// If iPhone 5 or new iPod Touch
if([UIScreen mainScreen].bounds.size.height == 568)
VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewControllerExt" bundle:nil];
...
else
// Regular iPhone
VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewController" bundle:nil];
...
// If iPad
else
VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewControllerPad" bundle:nil];
...
希望它能帮助有需要的人:)
【讨论】:
【参考方案4】:如果你有这个命名约定
VGArticlePage~ipad.xib
VGArticlePage~iphone.xib
VGArticlePage~iphone_ext.xib
那么你可以这样做
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
- (NSString *)nibNameForClass:(Class)class
if(IS_IPHONE && IS_IPHONE_5)
return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~iphone_ext"];
else if(IS_IPHONE)
return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~iphone"];
else
return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~ipad"];
【讨论】:
如果将 nibNameForClass 方法作为静态函数放置在 Util 类中,它可以在应用程序的任何地方使用。我更喜欢这个而不是 gmogames 的解决方案。以上是关于为 iPhone 5 加载不同的 xib的主要内容,如果未能解决你的问题,请参考以下文章