检查是否支持UIGraphicsBeginImageContextWithOptions

5

我正在开发一款iOS应用程序。目前它仅适用于iOS4,因为我在多个场合使用以下方法:"UIGraphicsBeginImageContextWithOptions"。此方法仅适用于iOS 4,因此我的应用程序当前会崩溃/无法在iPhone OS 3上运行。除了这个方法之外,没有理由应用程序不能在iPhone OS 3上工作。如何检查此方法是否可用?我尝试过以下方法但没有成功:

if([self respondsToSelector:@selector(UIGraphicsBeginImageContextWithOptions)]) {
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0); // this will crop
}
else 
{
    UIGraphicsBeginImageContext(targetSize);

}

我只尝试过这样的变化:

if([self respondsToSelector:@selector(UIGraphicsBeginImageContextWithOptions:size:opaque:scale:)])

并且

if([self respondsToSelector:@selector(UIGraphicsBeginImageContextWithOptions:)])

没有成功。任何帮助都将不胜感激。

3个回答

12

UIGraphicsBeginImageContextWithOptions是一个C函数,因此你不能使用Objective-C方法,如-respondsToSelector:来测试它的存在。

但你可以弱链接UIKit框架,然后检查UIGraphicsBeginImageContextWithOptions是否为NULL。

if (UIGraphicsBeginImageContextWithOptions != NULL) {
   UIGraphicsBeginImageContextWithOptions(...);
} else {
   UIGraphicsBeginImageContext(...);
}

谢谢,您确定我需要弱链接UIKit吗? - Gidogeek
@Gido:不需要,你可以使用dlsym。但是弱链接是最简单的方法。 - kennytm
@Gido:尝试将UIGraphicsBeginImageContextWithOptions转换为void* - kennytm
@KennyTM 很遗憾,这也没有帮助。也许我应该在其他地方寻找问题...如果所有这些人都可以无障碍地使用它,那么我的设置肯定有问题。可能是一些基本的东西,所以我将列出我的构建目标 plist 中的一些属性:
  • 基础 SDK:iPhone Device 4.0
  • C/C++ 编译器:LLVM 编译器 1.5
  • iPhone OS 部署目标:iPhone OS 3.1.3
我在类别中有上述代码,如下所示:@interface UIImage (Resizing)// 包含版本特定代码的方法@end这可能是问题的原因吗?
- Gidogeek
@KennyTM 把编译器切换到GCC 4.2居然奏效了..这太傻了吧?这是个bug吗?不管怎样,还是谢谢! - Gidogeek
显示剩余7条评论

1

我有同样的问题。你可以尝试测试系统版本。在我测试过的设备上,这似乎是可行的。

char majorVersion = [[[UIDevice currentDevice] systemVersion] characterAtIndex:0];
if (majorVersion == '2' || majorVersion == '3')
     UIGraphicsBeginImageContext(...);
else
     UIGraphicsBeginImageContextWithOptions(...);

0

我知道这是一个老问题,但是在新的Xcode和iOS版本(大于9)中,这些方法都不适用于我。

我总是以这种方式检查系统版本:

NSString *sysver = [[UIDevice currentDevice] systemVersion];
NSArray *versionNums = [sysver componentsSeparatedByString:@"."];
int majorVersion = [versionNums[0] intValue];
if (majorVersion > 3){
    UIGraphicsBeginImageContextWithOptions(...);
}
else{
    UIGraphicsBeginImageContext(...);
}

我希望这能帮助到任何人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接