Проверка, поддерживается ли UIGraphicsBeginImageContextWithOptions

Я работаю над приложением для iOS. В настоящее время он работает только на iOS 4, поскольку я несколько раз использую следующий метод: «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:)])

Безуспешно. Любая помощь будет оценена.


person Gidogeek    schedule 31.08.2010    source источник


Ответы (3)


UIGraphicsBeginImageContextWithOptions - это функция C, поэтому вы не можете использовать методы Objective-C, такие как -respondsToSelector:, для проверки ее существования.

Однако вы можете слабое звено структура UIKit, а затем проверьте, имеет ли UIGraphicsBeginImageContextWithOptions значение NULL:

if (UIGraphicsBeginImageContextWithOptions != NULL) {
   UIGraphicsBeginImageContextWithOptions(...);
} else {
   UIGraphicsBeginImageContext(...);
}
person kennytm    schedule 31.08.2010
comment
Спасибо, вы уверены, что мне нужно слабое звено UIKit? - person Gidogeek; 31.08.2010
comment
@Gido: Нет. Вы можете использовать dlsym. Но слабое звено проще всего. - person kennytm; 31.08.2010
comment
Я установил слабую связь с фреймворком UIKit и ввел код, который вы здесь показываете. Однако на iPhone под управлением OS 3.0 ему по-прежнему удается пройти через оператор IF вместо того, чтобы попасть в else .. - person Gidogeek; 31.08.2010
comment
В настоящее время код выглядит так: dl.dropbox.com/u/610806/backwardscompatability.png Однако код попадает в строку NSLog на iPhone 3G с версией 3.1.3, в которой нет этого метода. Что я делаю не так? - person Gidogeek; 01.09.2010
comment
@Gigo: Попробуй NSLog(@"%p", UIGraphicsBeginImageContextWithOptions)? - person kennytm; 01.09.2010
comment
@KennyTM выводит 0x0 - person Gidogeek; 01.09.2010
comment
@Gidogeek: Нечетно, значит, строка if не должна проходить, поскольку 0 != NULL явно ложь. - person kennytm; 01.09.2010
comment
@KennyTM, вот что я подумал ... но как-то это проходит ... выдергивая волосы из-за этого ... что еще я мог попробовать? - person Gidogeek; 01.09.2010
comment
@Gido: попробуйте преобразовать UIGraphicsBeginImageContextWithOptions в void*? - person kennytm; 01.09.2010
comment
@KennyTM, к сожалению, это тоже не помогло. Вероятно, мне следует поискать проблему в другом месте ... если все эти люди используют его без проблем, я должен делать что-то не так в моей настройке. Вероятно, что-то базовое, поэтому я перечислю некоторые свойства в моем списке для моей цели сборки: * Базовый SDK: устройство iPhone 4.0 * Компилятор C / C ++: компилятор LLVM 1.5 * Цель развертывания iPhone OS: iPhone OS 3.1.3 У меня есть ранее упомянутый код в такой категории: @interface UIImage (Resizing) // методы, содержащие код конкретной версии @end Может ли это быть причиной проблемы? - person Gidogeek; 01.09.2010
comment
@Kenny TM переключение компилятора на GCC 4.2 действительно сработало ... как это глупо? это ошибка? Спасибо, в любом случае ! - person Gidogeek; 01.09.2010
comment
@Gido: Вероятно, слишком агрессивно оптимизирующая ошибка LLVM. Отправьте отчет об ошибке. - person kennytm; 01.09.2010

У меня точно такая же проблема. Вы можете попробовать протестировать версию системы. Кажется, это работает для меня на устройствах, которые я тестировал.

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

Я знаю, что это старый вопрос, но с новыми версиями Xcode и iOS (выше 9) любой из этих методов у меня работает.

Я всегда проверяю версию системы так:

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

Надеюсь, это кому-нибудь поможет.

person f3r83    schedule 09.06.2017