我通常宣布rects&例如,我的视图控制器中的静态const格式的颜色。 (这些是编译时间)
#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代在编译时无法确定这一点。 (对于iPhone 5,我们可以在armv7s架构的构建设置中添加预处理器宏 - > img如下),但对于iTouch,架构是armv7&这也会与iPhone4S发生冲突,如果Apple将来在同一架构中发布具有混合尺寸屏幕的新设备,这种方法实际上已经搞砸了。
我的问题是什么是解决方法/修复或替代它。 ?我还会列出一些事情,但我想知道你的意见和做这样的事情的最佳做法。
1 - 以相同的方式假设它用于较旧的320x480设备并使UI元素扩展或增长(autoresizingmask),因为它获得了在运行时分配的正确屏幕大小。
2 - 使用+ initialize()方法,这将是运行时(与原始方法中的编译时间形成对比),但您可以访问所有复杂的方法来查找屏幕大小&设备类型。
或其他一些方法,因为上述所有方法都是愚蠢的。
答案 0 :(得分:2)
不要尝试在编译时检测设备,这是不可能的。您无法事先知道您的代码将运行什么类型的设备,因为正如您所说,Apple可以发布在iPhone 7 / iPod 5上具有不同硬件特性的armv7上运行的未来iOS设备。
相反,您需要在运行时检测设备类型,然后采取适当的操作。由于某些功能(如屏幕大小)在运行时才会知道,因此显然它们不能是编译时常量,因此您需要相应地重构代码。
理想情况下,您不应该尝试检测特定的*设备类型,然后根据它进行操作;相反,确定您/需要哪些功能,并采取相应措施。例如,在运行时获取屏幕大小,而不是硬编码多个设备的不同屏幕大小。检测您是否有摄像头,然后根据该摄像头决定拍照等。检测设备是否支持OpenGL ES v2.0,然后根据该设置更改渲染代码。等等。
但如果您确实需要检测特定设备型号,this question会有几个答案向您展示如何。
答案 1 :(得分:0)
我同意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);
此示例使用视图的边界,但您可以替换另一个常量值(例如,屏幕大小)。