我刚刚升级到 Xcode 4.5 GM,发现您现在可以将 ‘4” Retina’ 尺寸应用到情节提要中的视图控制器。
现在,如果我想创建一个在 iPhone 4 和 5 上运行的应用程序,当然我必须构建每个窗口两次,但我还必须检测用户是否拥有 3.5” 或 4” 屏幕的 iPhone,然后应用看法。
我该怎么做?
首先,您不应该重建所有视图以适应新屏幕,也不应该为不同的屏幕尺寸使用不同的视图。
使用 iOS 的 自动调整大小 功能,您的视图可以调整和适应任何屏幕尺寸。
这不是很难,请阅读一些有关此的文档。它将为您节省大量时间。
iOS 6 还为此提供了新功能。 请务必阅读Apple Developer 网站上的iOS 6 API 更改日志。 并检查新的 iOS 6 AutoLayout 功能。
也就是说,如果你真的需要检测 iPhone 5,你可以简单地依靠屏幕大小。
[ [ UIScreen mainScreen ] bounds ].size.height
iPhone 5 的屏幕高度为 568。 你可以想象一个宏来简化这一切:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
fabs正如 H2CO3 在评论中指出的那样,在比较浮点时,使用epsilon 是为了防止精度错误。
fabs
因此,从现在开始,您可以在标准 if/else 语句中使用它:
if( IS_IPHONE_5 ) {} else {}
编辑 - 更好的检测
正如某些人所说,这仅 检测到宽屏 ,而不是实际的 iPhone 5。
下一个版本的 iPod touch 可能也会有这样的屏幕,所以我们可能会使用另一组宏。
让我们重命名原始宏IS_WIDESCREEN:
IS_WIDESCREEN
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
让我们添加模型检测宏:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] ) #define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
这样,我们可以确保我们有一个 iPhone 型号 和 一个宽屏,我们可以重新定义IS_IPHONE_5宏:
IS_IPHONE_5
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
另请注意,正如@LearnCocos2D 所述,如果应用程序未针对 iPhone 5 屏幕进行优化(缺少 Default-568h@2x.png 图像),则此宏将不起作用,因为在这种情况下屏幕尺寸仍为 320x480一个案例。
我不认为这可能是一个问题,因为我不明白我们为什么要在未优化的应用程序中检测 iPhone 5。
重要 - iOS 8 支持
在 iOS 8 上,该类的bounds属性UIScreen现在反映了 设备方向 。 很明显,前面的代码不能开箱即用。
bounds
UIScreen
为了解决这个问题,您可以简单地使用新nativeBounds属性,而不是bounds,因为它不会随着方向而改变,并且它基于纵向模式。 请注意,尺寸nativeBounds以像素为单位,因此对于 iPhone 5,高度将是 1136 而不是 568。
nativeBounds
如果您还针对 iOS 7 或更低版本,请务必使用功能检测,因为nativeBounds在 iOS 8 之前调用会导致您的应用崩溃:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) { /* Detect using nativeBounds - iOS 8 and greater */ } else { /* Detect using bounds - iOS 7 and lower */ }
您可以通过以下方式调整以前的宏:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) #define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON ) #define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
显然,如果您需要检测 iPhone 6 或 6 Plus,请使用相应的屏幕尺寸。