我有一个 Constants.h 文件,其中实际上包含一些全局常量。由于我的应用程序是为 iPhone 和 iPad 构建的,我想为这两种设备类型定义相同的常量(即具有相同的名称)。
完整的解释:
/******** pseudo code *********/
if (deviceIsIPad){
#define kPageMargin 20
}
else {
#define kPageMargin 10
}
我怎样才能做到这一点?谢谢。
L.
我有一个 Constants.h 文件,其中实际上包含一些全局常量。由于我的应用程序是为 iPhone 和 iPad 构建的,我想为这两种设备类型定义相同的常量(即具有相同的名称)。
完整的解释:
/******** pseudo code *********/
if (deviceIsIPad){
#define kPageMargin 20
}
else {
#define kPageMargin 10
}
我怎样才能做到这一点?谢谢。
L.
在预处理步骤中获取设备类型是不可能的。它是在运行时动态确定的。你有两个选择:
创建两个不同的目标(分别用于 iPhone 和 iPad)并在那里定义宏。
创建插入表达式的宏,如下所示:
#define IS_IPAD (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) #define kMyConstant1 (IS_IPAD ? 100 : 200) #define kMyConstant2 (IS_IPAD ? 210 : 230) #define kMyConstant3 (IS_IPAD ? @"ADASD" : @"XCBX")
#define
在编译时解析,即在您的计算机上
显然,您不能以您想要的方式使它们成为有条件的。我建议创建static
变量并将它们设置在+(void)initialise
你的类的方法上。
对于条件,使用类似的东西
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
} else {
// iPhone or iPod touch.
}
所以那会去
static NSInteger foo;
@implementation bar
+(void)initialise{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
foo = 42;
} else {
// iPhone or iPod touch.
foo = 1337;
}
}
@end
嗨,在appdelegate
课堂上写这段代码
+(NSString *)isAppRunningOnIpad:(NSString *)strNib{
NSString *strTemp;
NSString *deviceType = [UIDevice currentDevice].model;
if ([deviceType hasPrefix:@"iPad"]){
strTemp=[NSString stringWithFormat:@"%@I",strNib];
}
else{
strTemp=strNib;
}
return strTemp;
}
使用此行从您的班级中调用它
SecondVC *obj_secondvc = [[SecondVC alloc] initWithNibName:[AppDelegate isAppRunningOnIpad:@"SecondVC"] bundle:nil];
使用 UIDevice 宏 - http://d3signerd.com/tag/uidevice/
然后你可以编写如下代码;
if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) {
}
或者
if (IS_SIMULATOR && IS_RETINA) {
}
您不能使用定义来执行此操作,因为它们在编译时会被扩展。但是,您可以根据用户界面习惯定义变量并设置其初始值:
// SomeClass.h
extern CGFloat deviceDependentSize;
// SomeClass.m
- (id)init
{
// ...
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad])
deviceDependentSize = 1024.0f; // iPad
else
deviceDependentSize = 480.0f; // iPhone
// etc.
}