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

Добавление тени в текст NSString в методе drawRect: без использования UILabel

Я хотел бы добавить тень в текст, нарисованный с использованием метода категории 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 кадров в секунду в производительности прокрутки таблицы.

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

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

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

4b9b3361

Ответ 1

Он отлично работает для меня с 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]];
}