7

我正在设置一个应用程序,我想根据正在使用的 iPhone 类型对视图布局进行一些更改。具体来说我想知道竖屏分辨率是1136(iPhone5)还是960(iPhone4)。我想做的一件事是调整 UITableView 中 UITableViewCells 的高度,以便在任一手机上运行应用程序时都不会显示部分单元格。

我的问题是:检测正在使用的手机硬件类型以便我可以对视图布局进行适当更改的最佳方法是什么?

4

5 回答 5

16

我没有 iphone 5,但在另一部手机上,这段代码效果很好:

NSMutableDictionary *devices = [[NSMutableDictionary alloc] init];
[devices setObject:@"simulator"                     forKey:@"i386"];
[devices setObject:@"iPod Touch"                    forKey:@"iPod1,1"];
[devices setObject:@"iPod Touch Second Generation"  forKey:@"iPod2,1"];
[devices setObject:@"iPod Touch Third Generation"   forKey:@"iPod3,1"];
[devices setObject:@"iPod Touch Fourth Generation"  forKey:@"iPod4,1"];
[devices setObject:@"iPhone"                        forKey:@"iPhone1,1"];
[devices setObject:@"iPhone 3G"                     forKey:@"iPhone1,2"];
[devices setObject:@"iPhone 3GS"                    forKey:@"iPhone2,1"];
[devices setObject:@"iPad"                          forKey:@"iPad1,1"];
[devices setObject:@"iPad 2"                        forKey:@"iPad2,1"];
[devices setObject:@"iPhone 4"                      forKey:@"iPhone3,1"];
[devices setObject:@"iPhone 4S"                     forKey:@"iPhone4"];
[devices setObject:@"iPhone 5"                      forKey:@"iPhone5"];

- (NSString *) getDeviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [devices objectForKey:[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]];
}

记得导入:

#import "sys/utsname.h"
于 2012-10-24T09:29:28.520 回答
8

您应该真正使用自动布局功能来使您的视图适应屏幕的任何格式。

但是,如果您只想知道设备是否是 iPhone 5(即高度为 1136 像素),您可以使用:

[ [ UIScreen mainScreen ] bounds ].size.height

当然可以变成宏。

于 2012-10-24T09:30:27.190 回答
2
#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

在一些 constant.h 文件中定义这个宏,并在任何地方使用它来检查

if(IS_IPHONE5)
{
// iphone 5
}
else
{
// earlier
}
于 2012-10-24T09:30:10.320 回答
2

从您的问题来看,您似乎想根据设备和分辨率来纠正 UI。在这种情况下,这很好,您可以使用下面给定的代码来识别设备。但是对于非 UI 的事情,比如寻找一个设备中存在的设备功能,而另一个设备中不存在,总是建议检查该功能是否存在,而不是设备型号。来自苹果官方论坛。(要求登录)

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
  if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
    CGSize result = [[UIScreen mainScreen] bounds].size;
    CGFloat scale = [UIScreen mainScreen].scale;
    result = CGSizeMake(result.width * scale, result.height * scale);

    if(result.height == 960){
      NSLog(@"iphone 4, 4s retina resolution");
    }
    if(result.height == 1136){
      NSLog(@"iphone 5 resolution");
    }
  }else{
    NSLog(@"iphone standard resolution");
  }
}else{
  if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
    NSLog(@"ipad Retina resolution");
  }else{
    NSLog(@"ipad Standard resolution");
  }
}
于 2012-10-24T09:30:15.940 回答
1

我一直在检查纵横比。不像其他一些方法那样通用,但对于未来的设备来说仍然比检查特定分辨率更灵活。

// 0.563380 = 16x9 (iPhone 5)
// 0.666667 = 3x2  (iPhone 4S and previous)
CGFloat aspectRatio = [UIScreen mainScreen].bounds.size.width / [UIScreen mainScreen].bounds.size.height;
// Tall Screen
if (aspectRatio > 0.55 && aspectRatio < 0.57) {
    // Tall screen stuff.
    }

    // Short Screen
} else if (aspectRatio > 0.64 && aspectRatio < 0.68) {

    // Short screen stuff.
    }
}
于 2012-10-24T17:24:25.290 回答