2013-04-05 3 views
2

Поэтому я использую следующий код, чтобы применить штрих (и заполнить) к тексту в UILabel, и он выходит как изображение ниже. Ход тяжелее с одной стороны, чем другой (посмотрите на верхнюю часть букв по сравнению с нижней, а справа по сравнению с левым. Период в конце делает его очень заметным, тоже выглядит как глазу). У меня вообще нет тени, поэтому я не думаю, что это тень, мешающая удару.kCGTextStroke's Fill and Stroke не установлены правильно

Что может быть причиной этого?

- (void) drawTextInRect: (CGRect) rect 
{ 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetTextDrawingMode(c, kCGTextFillStroke); 
    CGContextSaveGState(c); 
    CGContextSetRGBFillColor(c, 1.0, 0.0, 0.0, 1.0); 
    CGContextSetRGBStrokeColor(c, 0.0, 1.0, 0.0, 1.0); 
    [super drawTextInRect: rect]; 
    CGContextRestoreGState(c); 
} 

enter image description here

EDIT: Итак, для пинков, я взял на взгляд на этикетке только с заливкой, и только инсультом. Отключение штриха создает совершенно нормальный фрагмент текста, как будто я просто поместил его в Interface Builder. Однако при выключении заливки отображается только штрих, который не выглядит тяжелее на любой стороне, чем любой другой. ** Это заставляет меня думать, что проблема заключается в том, что вопрос , где заполняется по отношению к штриху, и что ни сам по себе, ни сам по себе удар не виноват. Любые другие мысли по этому поводу? Как я могу получить заполнение с центром в штрихе?

+0

Разве вы не должны просто использовать 'kCGTextFillStroke' в качестве режима рисования и рисовать только один раз (с отдельными настройками инсульта и заливки) или инсульт после заливки? –

+0

@ DavidRönnqvist Это, похоже, помогло. Если вы хотите написать ответ, я могу отметить его. Кажется странным, что порядок будет иметь значение, нет? – Luke

ответ

4

Вы должны, вероятно, просто использовать kCGTextFillStroke как режим рисования и рисовать только один раз (с отдельным обводки и заливки набор цветов).

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); // any color you want (this is red) 
CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 1.0); // any color you want (this is green) 
CGContextSetTextDrawingMode(context, kCGTextFillStroke); 
[self.text drawInRect:rect withFont:self.font]; 

В качестве альтернативы вы могли бы просто погладить впоследствии. Штрихи обычно вытягиваются из центра, что означает, что половина ширины - внутрь, а половина - наружу. Это означало бы, что если вы заполните после того, как вы нанесете удар, часть удара будет покрыта заполнением.

+0

Кажется, что игнорирует выбор цвета, это всего лишь отображение белого (что странно, поскольку в интерфейсе Builder он черный). Я обновил код выше. – Luke

+0

(Оба заливки и штриховки белого цвета). – Luke

+0

Супер-реализация может переопределить цвета контекста. Вы можете нарисовать строку самостоятельно, используя обычный 'drawInRect: withFont:' (см. Мой обновленный ответ). –

1

Возможность заключается в том, что переопределенный метод преобразует CTM, используя CGContextTranslateCTM или аналогичные функции. CTM является частью состояния контекста и указывает преобразование для всех последующих вызовов вызова.

Вы должны попытаться сохранить контекст перед вызовом переопределенного метода и восстановить его впоследствии:

CGContextSaveGState(c); 
[super drawTextInRect: rect]; 
CGContextRestoreGState(c); 
+0

Это не имеет никакого значения, думаю, это не проблема. Хорошая попытка, хотя :) – Luke

+0

@lukech У вас есть доступ к переопределенному методу? Если да, напишите этот код. –

+0

Я отправил метод drawTextInRect: ', и я не переопределил других - что еще вам нужно увидеть? – Luke

Смежные вопросы