我正在尝试在我的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,但这并没有成功。请帮忙......
答案 0 :(得分:3)
我刚试过你的代码,它对我有用。但是有一些注意事项:
您应该使用self.bounds
作为目标矩形来绘制,而不是rect
参数,因为这意味着“这是您视图的无效区域”。这是性能优化,您很少需要使用它。
您无需致电CGContextSaveGState
(当您这样做时,您将需要在此之后恢复它)。当您调用实际修改当前上下文的子例程(并在之后恢复它)时,通常会这样做,但理想情况下,这应该移动到例程本身。
尝试将视图背景设置为白色并使字体更大,您可能会得到有关正在发生的事情的提示。此外,您可以在此处发布截图。
更新:
我没有注意到你在使用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];
}