3

我正在尝试在我的 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

4 回答 4

3

我刚刚尝试了您的代码,它确实对我有用。不过有几点注意事项:

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

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

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

更新:

我没有注意到你在使用UITextView. 您不应该使用此类并进行自定义绘图!如果您想自己绘制文本,请使用 subclass UIView。如果您想使用UITextView,请使用(例如,在您的子类中设置它的attributedString属性。这是有关属性字符串的更多信息:Apple docsUITextViewviewDidLoadUIViewController

于 2013-04-18T20:09:10.250 回答
2

哦,天哪,文本系统是一个由很多很多(大部分是私有的)类、方法和数据结构组成的复杂野兽。

你有 NSTextStorage、NSLayoutManager、NSTextContainer 和 UITextView 作为公共类。投入 UITextRange 和 UITextPosition 以获得良好的衡量标准。在 Mac OS X 上,您也有排版类。

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

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

于 2014-05-28T09:30:18.040 回答
0

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

代替:

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

尝试:

[[self text] setNeedsDisplayInRect:rect];
于 2013-04-18T21:03:27.313 回答
0

我用它来避免这个问题

- (void)drawRect:(CGRect)rect{

    //YOUR Drawing code here ...

    self.textColor = [UIColor clearColor];
}
于 2015-06-15T08:48:18.253 回答