我正在处理多个终端屏幕应用程序,因为我有终端视图的自定义UIView
子类。每次我需要一个新的终端屏幕时,我都会准备一个新视图。
此视图类使用CGContextRef
绘制文本。我面临的问题是上下文仅绘制了最后创建的视图的文本,例如如果我有3个终端并且在第一个/第二个上绘图,它仍然会在第三个上绘制。
到目前为止我的代码:
-(void)drawRect:(CGRect)rect{
contxt = UIGraphicsGetCurrentContext();
}
-(void)setNeedsDisplayInRect:(CGRect)rect{
UIGraphicsPushContext(contxt);
//CGContextSaveGState(contxt);
CGContextSetTextMatrix(contxt,CGAffineTransformIdentity);
if (translated) {
CGContextScaleCTM(contxt, 1, -1);
translated = NO;
}
CGRect rectConvert = CGRectMake(rect.origin.x, rect.origin.y-screenWindowHeight, rect.size.width, rect.size.height);
CGContextSetFillColorWithColor(contxt, bgColor.CGColor);
CGContextFillRect(contxt, rectConvert);
if (!isDeleteChar) {
CGContextSetFillColorWithColor(contxt, fgColor.CGColor);
[displayString drawInRect:rectConvert withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft];
}
if (ul == EXTENDED_5250_UNDERLINE) {
CGContextSetFillColorWithColor(contxt, fgColor.CGColor);
[@"_" drawInRect:rectConvert withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft];
}
//CGContextRestoreGState(contxt);
UIGraphicsPopContext();
}
最后我自己使用
解决了这个问题 在[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
之后 setNeedsDisplay
。
答案 0 :(得分:2)
首先,您不应该使用-setNeedsDisplayRect:
方法进行绘图,所有绘图代码都应该在drawRect:
中。这样,主runloop可以更好地组织重绘视图。
其次,我怀疑您用于CGRect
转换的变量是错误的,并且正在视图范围之外。您可以通过剪切视图的绘图来测试此前提(将layer.masksToBounds
设置为YES
以获取视图)
如果是这种情况,您可以将它们调整为相对于视图(视图中的所有绘图都应该相对于其边界而不是其边框)。绘制视图时,假设画布延伸视图的bounds
属性,即(0,0)
的原点和(width,height)
的大小。
现在,值得讨论传递给rect
的{{1}}属性到底是什么,它不能保证是视图的整个边界,所以你不应该假设。视图的一部分需要重新绘制,但是,通常的做法(对于更简单的视图)是忽略该参数并重新绘制整个视图。一旦这变得太昂贵(或者您需要绘图更加优化),您可以考虑对视图进行部分重绘。
总而言之,如果没有看到整个drawRect:
子类代码,很难诊断出完整的问题。