这是我上一期的问题。我正在使用beginAnimations:context:
设置动画块来动画一些UITextLabels。但是我在文档中注意到:“在iOS 4.0及更高版本中不鼓励使用此方法。您应该使用基于块的动画方法。”
我的问题是我很想使用animateWithDuration:动画:(在iOS 4.0及更高版本中可用)但不想排除使用iOS 3.0的人。有没有办法在运行时检查设备的iOS版本,以便我可以决定使用哪个语句?
答案 0 :(得分:59)
为将来需要帮助的人提供更简单的解决方案:
NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ( 5 == [[versionCompatibility objectAtIndex:0] intValue] ) { /// iOS5 is installed
// Put iOS-5 code here
} else { /// iOS4 is installed
// Put iOS-4 code here
}
答案 1 :(得分:51)
在许多情况下,您不需要直接检查iOS版本,而是可以检查运行时是否存在特定方法。
在您的情况下,您可以执行以下操作:
if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){
// animate using blocks
}
else {
// animate the "old way"
}
答案 2 :(得分:19)
符合系统定义
中指定的版本 // #define __IPHONE_2_0 20000
// #define __IPHONE_2_1 20100
// #define __IPHONE_2_2 20200
//#define __IPHONE_3_0 30000
// #define __IPHONE_3_1 30100
// #define __IPHONE_3_2 30200
// #define __IPHONE_4_0 40000
你可以写这样的功能
(你应该将这个版本存储在某个地方,而不是每次都计算它):
+ (NSInteger) getSystemVersionAsAnInteger{
int index = 0;
NSInteger version = 0;
NSArray* digits = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
NSEnumerator* enumer = [digits objectEnumerator];
NSString* number;
while (number = [enumer nextObject]) {
if (index>2) {
break;
}
NSInteger multipler = powf(100, 2-index);
version += [number intValue]*multipler;
index++;
}
return version;
}
然后你可以按如下方式使用它:
if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0)
{
//blocks
} else
{
//oldstyle
}
答案 3 :(得分:6)
气馁与弃用不同。
如果您需要支持没有基于块的方法的早期版本的iOS,使用旧方法没有任何问题(当然,只要它们没有被删除)。
答案 4 :(得分:6)
您可以使用Foundation框架的版本来确定当前的系统版本。
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
//for earlier versions
} else {
//for iOS 7
}
答案 5 :(得分:6)
这里的大多数解决方案都太过分了。您需要做的只是[[UIDevice currentDevice].systemVersion intValue]
。这会自动删除小数,因此无需拆分字符串。
所以你可以检查一下:
if ([[UIDevice currentDevice].systemVersion intValue] >= 8) {
// iOS 8.0 and above
} else {
// Anything less than iOS 8.0
}
您还可以使用以下代码定义宏:
#define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue];
甚至包括您的支票:
#define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8)
然后你只需要这样做:
if (IOS_8PLUS) {
// iOS 8.0 and above
} else {
// Anything less than iOS 8.0
}
答案 6 :(得分:4)
Xcode 7添加了available
语法,使其相对更简单:
if #available(iOS 9, *) {
// iOS 9 only code
}
else {
// Fallback on earlier versions
}
Xcode 9还将此语法添加到Objective-C
Objective-C:
if (@available(iOS 9.0, *)) {
// iOS 9 only code
} else {
// Fallback on earlier versions
}
答案 7 :(得分:3)
出于我的目的,我编写了一个小型库,它抽象出底层的C调用,并提供了一个Objective-C接口。
GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails];
if (deviceDetails.iOSVersion >= 6) {
NSLog(@"It's running at least iOS 6"); //It's running at least iOS 6
}
除了获取当前的iOS版本外,它还会检测底层设备的硬件,并获取有关屏幕大小的信息;所有在运行时。
它在github上:GBDeviceInfo。在Apache 2下获得许可。
答案 8 :(得分:2)
将它放在Prefix.pch文件中
#define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue]
然后你可以查看iOS版本:
if(IOS_VERSION == 8)
{
// Hello 8!
}
else
{
// Hello some other version!
}
当然,如果您可以使用功能检测(对您的用例有意义),您应该这样做。
答案 9 :(得分:1)
在MonoTouch中:
要使用主要版本:
UIDevice.CurrentDevice.SystemVersion.Split('.')[0]
对于次要版本使用:
UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
答案 10 :(得分:1)
对上述解决方案的适应性更好,更有效:
-(CGPoint)getOsVersion
{
static CGPoint rc = {-1,-1};
if (rc.x == -1) {
NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
rc.x = [versionCompatibility[0] intValue];
rc.y = [versionCompatibility[1] intValue];
}
return rc;
}
现在你可以
if ([self getOsVersion].x < 7) {
}
HTH