例如,我通常在视图控制器中以静态const格式声明rects &颜色。(这些是编译时)
#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()方法,这将是运行时(与原始方法中的编译时间相反),但是您可以访问所有复杂的方法来查找屏幕大小和设备类型。
或者其他方式,因为上面所有的方法都是愚蠢的。
发布于 2013-08-09 04:23:56
不要试图在编译时检测设备,这是不可能的。您不可能预先知道您的代码将在哪种设备上运行,因为正如您所说,苹果可能会发布未来运行在armv7s上的armv7s设备,其硬件特性与iPhone 5 /iPod5不同。
相反,您需要在运行时检测设备类型,然后采取适当的操作。由于某些特性(如屏幕大小)要到运行时才知道,那么显然它们不能是编译时常量,因此您需要相应地重构代码。
理想情况下,您不应该试图检测特定的*设备类型,然后在此基础上采取行动;相反,确定您拥有/需要哪些特性,并对其采取行动。例如,在运行时获取屏幕大小,而不是硬编码几个设备的不同屏幕大小。检测您是否有相机,然后决定在此基础上拍摄一张照片,等等。检测设备是否支持OpenGL esv2.0,然后根据此更改您的呈现代码。诸若此类。
但是,如果您确实需要检测特定的设备模型,this question有几个答案告诉您如何检测。
发布于 2013-08-09 07:43:51
我同意Adam关于检测特性的意见,但是,我喜欢做的是用相对的术语定义恒定的大小和位置:
#define SOMERECT_X 0.25
#define SOMERECT_Y 0.25
#define SOMERECT_W 0.5
#define SOMERECT_H 0.5然后,当需要设置时,例如someRect:
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);此示例使用视图的界限,但您可以替换另一个常量值(例如,屏幕大小)。
https://stackoverflow.com/questions/18139643
复制相似问题