UITextView绘图文本两次

时间:2013-04-18 18:59:46

标签: ios uitextview

我正在尝试在我的UITextViews文本上创建描边文本。它工作正常,但文本在屏幕上绘制两次。这是我在UITextView的子类中的drawRect方法...

- (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设置为YES,但这并没有成功。请帮忙......

4 个答案:

答案 0 :(得分:3)

我刚试过你的代码,它对我有用。但是有一些注意事项:

  1. 您应该使用self.bounds作为目标矩形来绘制,而不是rect参数,因为这意味着“这是您视图的无效区域”。这是性能优化,您很少需要使用它。

  2. 您无需致电CGContextSaveGState(当您这样做时,您将需要在此之后恢复它)。当您调用实际修改当前上下文的子例程(并在之后恢复它)时,通常会这样做,但理想情况下,这应该移动到例程本身。

  3. 尝试将视图背景设置为白色并使字体更大,您可能会得到有关正在发生的事情的提示。此外,您可以在此处发布截图。

    更新:

    我没有注意到你在使用UITextView。你不应该使用这个类并进行自定义绘图!如果您想自己绘制文本,请继承UIView。如果您想使用UITextView,请使用attributedString的{​​{1}}属性(例如,在UITextView子类中设置viewDidLoad。 以下是有关归因字符串的更多信息:Apple docs

答案 1 :(得分:1)

哦,男孩,文本系统是许多很多(大多数是私有的)类,方法和数据结构的复杂野兽。

您有NSTextStorage,NSLayoutManager,NSTextContainer和UITextView作为公共类。抛出UITextRange和UITextPosition以获得良好的衡量标准。在Mac OS X上,您还有排字机类。

虽然UITextView要求NSLayoutManager在某些矩形区域中绘制文本(通过私有方法而不是drawRect),但绘图本身实际上是由NSLayoutManager完成的。如果你想自己绘制文本,你必须提供自己的NSLayoutManager子类。

使用NSLayoutManager子类作为最后的手段。使用自定义uiview自己绘制框架和文本,或使用uitextview并尝试找出系统正在绘制文本。你需要NSLayoutManager方法。绘制框架,但不绘制uitextview类的drawRect中的文本。

答案 2 :(得分:0)

你永远不应该直接调用drawRect。

而不是:

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

尝试:

[[self text] setNeedsDisplayInRect:rect];

答案 3 :(得分:0)

我用它来避免这个问题

- (void)drawRect:(CGRect)rect{

    //YOUR Drawing code here ...

    self.textColor = [UIColor clearColor];
}