Подтвердить что ты не робот

Можно ли нарисовать текст с тенями с помощью дополнений NSString UIKit?

Можно ли рисовать с помощью простых текстовых теней при использовании дополнений NSString UIKit? Я имею в виду, что без написания кода рисовать дважды в двух цветах, как это может быть сделано с различными классами UIKit, такими как UILabel и его свойствами shadowColor и shadowOffset, а также без фактических размытых теней через CGContextSetShadow (которые привязаны к быть намного дороже).

Apple doc для этих расширений фактически включают константы (в самом низу), включая UITextAttributeTextShadowColor и UITextAttributeTextShadowOffset, что подразумевает, что это возможно, но я не знаю, t увидеть их возможное использование в реальных методах.

4b9b3361

Ответ 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).

Ответ 2

Следующий фрагмент использует CALayer для добавления тени по краям символов в UILabel:

 _helloLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
[_helloLabel setBackgroundColor:[UIColor clearColor]];
[_helloLabel setTextColor:[UIColor whiteColor]];
[_helloLabel setTextAlignment:NSTextAlignmentCenter];
[_helloLabel setFont:[UIFont lightApplicationFontOfSize:30]];

_helloLabel.layer.shadowColor = UIColorFromRGB(0xd04942).CGColor;
_helloLabel.layer.shadowOffset = CGSizeMake(0, 0);
_helloLabel.layer.shadowRadius = 2.0;
_helloLabel.layer.shadowOpacity = 1.0;

[self addSubview:_helloLabel];

., обычно это добавляет тени вокруг границы, но UILabel, кажется, рассматривает эти свойства как особый случай.