Я использовал CGContextSetShadowWithColor()
в моем Кварцевом коде для прорисовки на iPhone для генерации "затоптавший в" ищут текст и другие вещи (в drawRect:
и drawLayer:inContext:
).
Работавший отлично, но при выполнении того же самого кода против iOS 3.2 и теперь iOS 4.0 я заметил, что тени - все в противоположном направлении. Например, в следующем коде я установил черную тень, чтобы быть на 1 пиксель выше текста, который дал его "нажатый в", смотрят, и теперь эта тень на 1 пкс ниже текста, давая ему стандартную тень.
...
CGContextSetShadowWithColor(context, CGSizeMake(0.f, 1.f), 0.5f, shadowColor);
CGContextShowGlyphsAtPoint(context, origin.x, origin.y, glyphs, length);
...
Теперь я не знаю, являюсь ли я (или были), выполнение чего-то не так или было ли изменение в обработке этой установки. Я не применил преобразования, которое объяснило бы это мне, по крайней мере, не сознательно. Я зеркально отразил текстовую матрицу в одном экземпляре, но не в других, и это поведение последовательно. Плюс я не смог найти что-либо об этом в Информации о версии SDK, таким образом, похоже, что это - вероятно, я. Какова могла бы быть проблема?
Так что, похоже, это ошибка или преднамеренная ошибка Apple; в любом случае, чтобы решить эту проблему, я сейчас использую категорию UIView
. Я установил направление тени Y, как и должно быть в iOS 3.2+, но пока я поддерживаю iOS <3.2, я буду использовать следующий метод класса, чтобы умножить направление на 1 или -1, в зависимости от требований device:
...
CGContextSetShadowWithColor(context, CGSizeMake(0.f, [UIView shadowVerticalMultiplier] * -1.f), 0.5f, textShadowColor);
...
Вот категория:
@interface UIView (shadowBug)
+ (NSInteger) shadowVerticalMultiplier;
@end
@implementation UIView (shadowBug)
+ (NSInteger) shadowVerticalMultiplier
{
static NSInteger shadowVerticalMultiplier = 0;
if (0 == shadowVerticalMultiplier) {
CGFloat systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
shadowVerticalMultiplier = (systemVersion < 3.2f) ? -1 : 1;
}
return shadowVerticalMultiplier;
}
@end
Кажется, это ошибка, которую они не удосужились исправить. :)
В iOS 4.0 есть такое же изменение в поведении (я нашел свой путь сюда через поиск по CGContextSetShadow
во время обновления своего приложения для iPhone под 4.0). Итак, очевидно, что CGContextSetShadow
ведет себя одним образом, если вы связываетесь с iPhone OS 3.1.3 и ранее, и по-другому, если вы связываетесь с iPhone OS 3.2 и более поздними версиями.