我刚刚升级到Xcode4.5GM,发现您现在可以在故事板中将‘4"视网膜大小应用到您的视图控制器上.
现在,如果我想创建一个同时在iPhone4和iPhone5上运行的应用程序,当然我必须 for each 窗口构建两次,但我还必须检测用户是否有3.5"或4"屏幕的iPhone,然后应用视图.
我该怎么做?
我刚刚升级到Xcode4.5GM,发现您现在可以在故事板中将‘4"视网膜大小应用到您的视图控制器上.
现在,如果我想创建一个同时在iPhone4和iPhone5上运行的应用程序,当然我必须 for each 窗口构建两次,但我还必须检测用户是否有3.5"或4"屏幕的iPhone,然后应用视图.
我该怎么做?
首先,您不应该重新构建所有视图来适应新屏幕,也不应该针对不同的屏幕大小使用不同的视图.
使用iOS的auto-resizing个功能,以便您的视图可以调整和适应任何屏幕大小.
这不是很难,读some documentation遍就知道了.这会为你节省很多时间.
iOS 6还为此提供了新功能
也就是说,如果你真的需要检测iPhone5,你可以简单地依靠screen size.
[ [ UIScreen mainScreen ] bounds ].size.height
iPhone 5的屏幕高度为568
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
这里将fabs
与epsilon一起使用是为了防止比较浮点时出现精度错误,如H2CO3的注释中所指出的那样.
因此,从现在开始,您可以在标准IF/ELSE语句中使用它:
if( IS_IPHONE_5 )
{}
else
{}
Edit - Better detection个
正如一些人所说,这款手机只支持detect a widescreen,而不是真正的iPhone5.
iPod touch的下一个版本可能也会有这样的屏幕,所以我们可能会使用另一组宏.
让我们将原始宏重命名为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 AND型号的宽屏,我们可以重新定义IS_IPHONE_5
宏:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
还要注意的是,正如@LearnCocos2D所说,如果应用程序没有针对iPhone5屏幕进行优化(缺少默认的-568h@2x.png图像),则此宏将不起作用,因为在这种情况下,屏幕尺寸仍然是320x480.
我不认为这是个问题,因为我不明白为什么我们要在未优化的应用程序中检测iPhone 5.
IMPORTANT - iOS 8 support个
在iOS 8上,UIScreen
类的bounds
属性现在反映device orientation.
因此,很明显,前面的代码不能开箱即用.
为了解决这个问题,您可以简单地使用新的nativeBounds
属性,而不是bounds
,因为它不会随着方向而改变,而且它基于纵向向上模式
如果你的目标也是iOS7或更低版本,一定要使用功能检测,因为在iOS8之前拨打nativeBounds
会让你的应用崩溃:
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 )
显然,如果你需要检测iPhone6或6 Plus,请使用相应的屏幕尺寸.