Ответ 1
Несколько мыслей:
-
Клавиши
UITextAttributeTextShadow...
предназначены для использования словаря текстовых атрибутов с помощью, например, методовUIAppearance
:NSDictionary *attributes = @{UITextAttributeTextShadowColor : [UIColor blackColor], UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(2.0, 0.0)], UITextAttributeTextColor : [UIColor yellowColor]}; [[UINavigationBar appearance] setTitleTextAttributes:attributes];
Клавиши
UITextAttributeTextShadow...
предназначены для использования только в тех методах, которые принимают словарь текстовых атрибутов. -
Ближайшим эквивалентным ключом при рисовании текстовых строк является использование присваиваемых строк с помощью клавиши
NSShadowAttributeName
:- (void)drawRect:(CGRect)rect { UIFont *font = [UIFont systemFontOfSize:50]; NSShadow *shadow = [[NSShadow alloc] init]; shadow.shadowColor = [UIColor blackColor]; shadow.shadowBlurRadius = 0.0; shadow.shadowOffset = CGSizeMake(0.0, 2.0); NSDictionary *attributes = @{NSShadowAttributeName : shadow, NSForegroundColorAttributeName : [UIColor yellowColor], NSFontAttributeName : font}; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"this has shadows" attributes:attributes]; [attributedText drawInRect:rect]; }
Если вы беспокоитесь о хите производительности теневого алгоритма, способного делать тени безье, тем не менее,
NSShadow
может пострадать от этого. Но, выполняя некоторые тесты, изменениеshadowBlurRadius
резко влияет на производительность. Например, анимация вращения сложного многострочного текста сshadowBlurRadius
10.0
на медленном iPhone 3GS достигла частоты кадров 31 fps, но изменениеshadowBlurRadius
до0.0
обеспечило частоту кадров 60 кадров в секунду.Нижняя строка, используя радиус размытия тени
0.0
, исключает большинство (если не все) вычислительных издержек тени, созданной безье. -
FYI, я испытываю аналогичное повышение производительности, установив значение
blur
в0.0
дляCGContextSetShadow
, как и в случае с приписанным текстом выше.
В нижней строке, я не думаю, что вы должны бояться вычислительных накладных расходов теней безье, если вы используете радиус размытия 0.0
. Я бы не удивился, если бы дважды написал текст, один раз для тени и снова для цвета переднего плана, может быть даже немного более эффективным, но я не уверен, что разница будет наблюдаемой. Но я не знаю какого-либо вызова API, который сделает это для вас (кроме CGContextSetShadow
с blur
of 0.0
).