2013-04-18 4 views
3

Я пытаюсь создать поглаженный текст в тексте UITextViews. Он работает нормально, но текст рисуется дважды на экране. Вот мой метод DrawRect в подклассе UITextView ...UITextView текст чертежа дважды

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    // Drawing code 

    UIFont *font = [UIFont fontWithName:@"Cochin" size:[_fontSize floatValue]]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetShadow(context, CGSizeMake(1, 1), 1); 
    CGContextSetRGBFillColor(context,1,1,1, 1); 
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 1); 
    CGContextSetLineWidth(context, .35); 
    CGContextSetTextDrawingMode(context, kCGTextFillStroke); 
    CGContextSaveGState(context); 
    [[self text] drawInRect:rect withFont:font]; 
} 

Я попытался установить clearsContextOnDraw Да, но это не сделать трюк. Помогите пожалуйста ...

+0

Вы нашли решение? Я получаю ту же проблему –

ответ

3

Я только что пробовал свой код, и он работает для меня. Есть несколько нот, хотя:

  1. Вы должны использовать self.bounds в качестве целевого прямоугольника, чтобы привлечь к, а не параметр rect вы получите, так как это означает, что «это недопустимая область вашей точки зрения». Это оптимизация производительности, и вам редко придется ее использовать.

  2. Вам не нужно звонить CGContextSaveGState (и когда вы это сделаете, вы захотите восстановить его после этого). Обычно вы это делаете при вызове подпрограммы, которая фактически изменяет текущий контекст (и восстанавливает его впоследствии), но в идеале это должно быть перемещено самой процедурой.

Попробуйте установить фон вашего вида на белый и увеличить шрифт, вы можете получить подсказки о том, что происходит. Кроме того, вы можете опубликовать снимок экрана здесь.

UPDATE:

Я не заметил, что вы использовали UITextView. Вы не должны использовать этот класс и делать собственный рисунок! Если вы хотите нарисовать свой текст самостоятельно, подкласс UIView. Если вы хотите использовать UITextView, используйте attributedString свойство UITextView (установить его в viewDidLoad, например, в вашем UIViewController подкласса Вот больше информации о приписываемых строках:.. Apple docs

+0

https://dl.dropboxusercontent.com/u/52280963/DEV/issueImage.png Это изображение моей проблемы. Слабым слоем в фоновом режиме является пользовательский чертеж drawRect. Черный слой спереди - это стандартный рисунок uitextview из его супервизора. –

+0

См. Мой обновленный ответ –

0

Вы никогда не должны вызывать DrawRect непосредственно

Вместо из:

[[self text] drawInRect:rect withFont:font]; 

Try:

[[self text] setNeedsDisplayInRect:rect]; 
+1

Обратите внимание, что он не вызывает метод 'UIView'' drawRect' напрямую, а 'drawInRect' из' NSString', который отличается и полностью прав. –

+0

Это не сработало. Он все еще рисует текст дважды. При первом запуске пользовательского кода рисования в drawRect. Вместо этого он рисует текст из текстового поля с его значениями по умолчанию. Я установил цвет для очистки цвета, и это решило его, но это похоже на харк. Мой вопрос заключается в том, как заставить drawRect останавливать рендеринг по умолчанию для uitextview? –

1

О, мальчик, текстовая система - это сложный зверь из многих, многих (в основном частных) классов, методов и структур данных.

У вас есть NSTextStorage, NSLayoutManager, NSTextContainer и UITextView как общедоступные классы. Бросьте в UITextRange и UITextPosition для хорошей оценки. В Mac OS X у вас также есть классы набора.

Хотя UITextView запрашивает NSLayoutManager для рисования текста в определенных областях прямоугольника (через частный метод вместо drawRect), сам чертеж фактически выполняется NSLayoutManager. Если вы хотите нарисовать текст самостоятельно, вам придется предоставить свой собственный подкласс NSLayoutManager.

Используйте подкласс NSLayoutManager в качестве последнего средства. Либо используйте пользовательский uiview для рисования кадра и текста самостоятельно, либо используйте uitextview и попытайтесь выяснить, с помощью чего система рисует текст. Для этого вам понадобятся методы NSLayoutManager. Нарисуйте кадры, но не текст в drawRect вашего класса uitextview.

0

Я использую это, чтобы избежать этой проблемы

- (void)drawRect:(CGRect)rect{ 

    //YOUR Drawing code here ... 

    self.textColor = [UIColor clearColor]; 
} 
Смежные вопросы