我刚刚升级到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,请使用相应的屏幕尺寸.

Ios相关问答推荐

更新Flutter项目时出错:CocoaPods找不到pod webview_flutter_wkwebview的兼容版本""

SwiftUI-工作表不显示导航标题

如何在 Swift 中存储具有关联值的协议?

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

SwiftUI - TextField - 在焦点上清除 Double 类型的值,在取消 Select 时恢复

SwiftUI withAnimation 在视图出现之前不会启动

Xcode 不支持 iOS 15.6

从父母到子元素的 Swift Pass 事件

有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

如何快速设置条形按钮的图像?

无法同时满足约束 - 没有适当的约束

何时需要将应用程序源包含在测试目标中?

在设备上卸载 ios 应用程序后如何在 ios 中保留 identifierForVendor?

获取 iOS 上所有联系人的列表

不变违规:应用程序 AwesomeProject 尚未注册使用静态 jsbundle 为 iOS 设备构建时

UIView 和 initWithFrame 以及一个 NIB 文件.如何加载 NIB 文件?

aps-environment 始终在发展

命令 /Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang 失败,退出代码为 1

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

将视图控制器从一个情节提要移动或复制到另一个情节提要