如何定义预处理器macros来检查iOS版本
我用它来检查iOS版本,但它不工作:
#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_5_0 #define kCFCoreFoundationVersionNumber_iPhoneOS_5_0 675.000000 #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 #define IF_IOS5_OR_GREATER(...) \ if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_5_0) \ { \ __VA_ARGS__ \ } #else #define IF_IOS5_OR_GREATER 0 #endif
当我做
#if IF_IOS5_OR_GREATER NSLog(@"iOS5"); #endif
什么都没发生。 这里有什么不对吗?
你已经定义了一个macros,但是你正在以非macros的方式使用它。 尝试这样的事情,与你的macros定义相同。
IF_IOS5_OR_GREATER(NSLog(@"iOS5");)
(而不是你的#if
/ #endif
块。)
更简单:
#define IS_IOS6_AND_UP ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
#ifdef __IPHONE_5_0
等等
只要看看这个常数。 所有的目标c常量都以两个下划线开头
定义这个方法:
+(BOOL)iOS_5 { NSString *osVersion = @"5.0"; NSString *currOsVersion = [[UIDevice currentDevice] systemVersion]; return [currOsVersion compare:osVersion options:NSNumericSearch] == NSOrderedAscending; }
然后将该macros定义为该方法。
对于运行时检查使用这样的东西:
- (BOOL)iOSVersionIsAtLeast:(NSString*)version { NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch]; return (result == NSOrderedDescending || result == NSOrderedSame); }
如果你在UIDevice上为它创build一个类别,你可以这样使用它:
@implementation UIDevice (OSVersion) - (BOOL)iOSVersionIsAtLeast:(NSString*)version { NSComparisonResult result = [[self systemVersion] compare:version options:NSNumericSearch]; return (result == NSOrderedDescending || result == NSOrderedSame); } @end
…
if([[UIDevice currentDevice] iOSVersionIsAtLeast:@"6.0"]) self.navigationBar.shadowImage = [UIImage new];
#define isIOS7 ([[[UIDevice currentDevice]systemVersion]floatValue] > 6.9) ?1 :0