在图形上下文上遇到麻烦



我正在处理多个终端屏幕应用程序,因为我有一个自定义的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之后。

首先,您不应该在-setNeedsDisplayRect:方法中进行绘制,所有的绘图代码都应在drawRect:中。这样,主运行环可以更好地组织重新绘制视图。

第二,我怀疑您用于CGRect转换的变量是故障的,并且在视图边界之外绘制。您可以通过剪辑视图的绘图(将layer.masksToBounds设置为YES的视图)来测试此前提

如果是这种情况,您可以将它们调整为相对于视图(视图中的所有绘图都相对于其边界,而不是其框架)。绘制视图时,假设一个画布,该画布拉伸了视图的bounds属性,即(0,0)(width,height)的大小。

现在,还值得讨论将rect传递给drawRect:的属性的确是什么,不能保证是视图的整个界限,因此您不应该假设。需要重新绘制的视图的一部分,但是,常见的做法(对于简单的视图)就是忽略该参数,而只是重新绘制整个视图。一旦这变得太昂贵(或者您需要图纸变得更加最佳),您就可以考虑进行视图的部分重新绘制。

总的来说,很难在不查看整个UIView子类代码的情况下诊断全部问题。

最新更新