首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编译时识别iDevices,最佳实践

在编译时识别iDevices,最佳实践
EN

Stack Overflow用户
提问于 2013-08-09 03:27:29
回答 2查看 95关注 0票数 0

例如,我通常在视图控制器中以静态const格式声明rects &颜色。(这些是编译时)

代码语言:javascript
复制
#import "something.h"

static const CGRect someRect = { w, x, y, z };
static const uint8_t someColor[] = { 255, 0 , 0}

@implementation

// other methods

@end

这样,当涉及到设备特定的场景时,不能很好地工作--。例如,如果我想使iPhone5 & iPod Touch 5代的rect值再高一点,就无法在编译时确定这一点。(对于iPhone 5,我们可以在armv7s架构-> img的构建设置中添加预处理器宏),但对于iTouch来说,其架构是armv7 &这也将与iPhone4S发生冲突,而且如果苹果将来在同一体系结构中发布具有混合尺寸屏幕的新设备,这种方法实际上就完蛋了。

我的问题是,什么是解决办法/解决办法,或替代这一点。?我还会列出一些想法,但是我想知道你的观点&做这样的事情的最佳实践。

1-假设它适用于较老的320x480设备,并使UI元素展开或增长(自动调整大小掩码),以获得在运行时分配的正确屏幕大小。

2-使用+initialize()方法,这将是运行时(与原始方法中的编译时间相反),但是您可以访问所有复杂的方法来查找屏幕大小和设备类型。

或者其他方式,因为上面所有的方法都是愚蠢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-09 04:23:56

不要试图在编译时检测设备,这是不可能的。您不可能预先知道您的代码将在哪种设备上运行,因为正如您所说,苹果可能会发布未来运行在armv7s上的armv7s设备,其硬件特性与iPhone 5 /iPod5不同。

相反,您需要在运行时检测设备类型,然后采取适当的操作。由于某些特性(如屏幕大小)要到运行时才知道,那么显然它们不能是编译时常量,因此您需要相应地重构代码。

理想情况下,您不应该试图检测特定的*设备类型,然后在此基础上采取行动;相反,确定您拥有/需要哪些特性,并对其采取行动。例如,在运行时获取屏幕大小,而不是硬编码几个设备的不同屏幕大小。检测您是否有相机,然后决定在此基础上拍摄一张照片,等等。检测设备是否支持OpenGL esv2.0,然后根据此更改您的呈现代码。诸若此类。

但是,如果您确实需要检测特定的设备模型,this question有几个答案告诉您如何检测。

票数 2
EN

Stack Overflow用户

发布于 2013-08-09 07:43:51

我同意Adam关于检测特性的意见,但是,我喜欢做的是用相对的术语定义恒定的大小和位置:

代码语言:javascript
复制
#define SOMERECT_X 0.25
#define SOMERECT_Y 0.25
#define SOMERECT_W 0.5
#define SOMERECT_H 0.5

然后,当需要设置时,例如someRect:

代码语言:javascript
复制
CGRect someRect = 
    CGRectMake(self.view.bounds.size.width * SOMERECT_X,
    self.view.bounds.size.height * SOMERECT_Y,
    self.view.bounds.size.width * SOMERECT_W,
    self.view.bounds.size.height * SOMERECT_H);

此示例使用视图的界限,但您可以替换另一个常量值(例如,屏幕大小)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18139643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档