CGContextSetShadow () - теневое направление, инвертированное между iOS 3.0 и 4.0?

Я использовал 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, таким образом, похоже, что это - вероятно, я. Какова могла бы быть проблема?

5
задан Pascal 8 June 2010 в 13:06
поделиться

3 ответа

Так что, похоже, это ошибка или преднамеренная ошибка 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
3
ответ дан 15 December 2019 в 06:16
поделиться

Кажется, это ошибка, которую они не удосужились исправить. :)

0
ответ дан 15 December 2019 в 06:16
поделиться

В iOS 4.0 есть такое же изменение в поведении (я нашел свой путь сюда через поиск по CGContextSetShadow во время обновления своего приложения для iPhone под 4.0). Итак, очевидно, что CGContextSetShadow ведет себя одним образом, если вы связываетесь с iPhone OS 3.1.3 и ранее, и по-другому, если вы связываетесь с iPhone OS 3.2 и более поздними версиями.

0
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: