Добавление тени к тексту NSString в drawRect: метод без использования UILabel - PullRequest
22 голосов
/ 08 декабря 2010

Я бы хотел добавить тень к тексту, нарисованному с помощью метода категории NSString (UIStringDrawing), поставляемого iOS:

- (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width 
             withFont:(UIFont *)font minFontSize:(CGFloat)minFontSize 
       actualFontSize:(CGFloat *)actualFontSize 
        lineBreakMode:(UILineBreakMode)lineBreakMode
   baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment; 

Очевидно, что здесь нет опции тени.

Да, здесь можно использовать UILabel и получить свойства тени для установки, но это не будет столь же эффективным, поскольку любой подкласс UIView (например, UILabel) оборачивает объект CALayer и будет более тяжелым(производительность).

Вот контекст:

Я делаю пользовательское рисование для подкласса UITableViewCell, реализуя drawRect: в представлении ячейки таблицы вместо создания ячейки таблицы из Nibфайл составных подклассов UIView.

Составление группы подклассов UIView лишило бы смысла пытаться сохранить этот наклон и оставаться в пределах 50-60 кадров в секунду при производительности прокрутки табличного представления.

Я попытался нарисовать строку дваждыс небольшим смещением.Это может оказаться приемлемым, как только я подправлю цвет тени на цвет фона ячейки, которую я собираюсь, но это выглядит довольно грязно.Конечно, у UILabel нет свойства размытия тени, как у UILabel.

Я искал решения, и они либо рекомендуют использование UILabel (которое я отклонил выше, поскольку у меня около дюжины различных текстовых элементов, скомпонованных нав представлении ячейки таблицы) или CGContextSetShadow().Последнее, кажется, всегда предлагается в контексте прямоугольных фигур и не обязательно для прикрепления тени к пути текста, нарисованного непосредственно с помощью метода NSString drawAtPoint..., упомянутого выше.(Я попробовал, но это не сработало (т.е. ничего не изменилось); я новичок в рисовании Core Graphics).

Предложения?

1 Ответ

40 голосов
/ 08 декабря 2010

У меня отлично работает с CGContextSetShadow(). Пример:

- (void)drawRect:(CGRect)rect 
{
    NSString *string = @"Hello World!";

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(20.0f, 20.0f), 10.0f);

    [string drawAtPoint:CGPointMake(100.0f, 100.0f) withFont:[UIFont boldSystemFontOfSize:36.0f]];
}
...