【发布时间】:2015-05-05 06:59:56
【问题描述】:
我正在开发多个终端屏幕应用程序,为此我有一个自定义的 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 之后。
【问题讨论】:
-
这个解决方案非常糟糕。正如@HenriNormak 所指出的,您不能在
setNeedsDisplayInRect中绘图。您在drawRect:中获取的上下文并未保证在您使用它时有效。你碰巧通过滥用 runloop 侥幸逃脱,但这会导致极其令人惊讶的副作用和死锁。drawRect:是唯一允许您在主上下文中绘制的位置。 -
@RobNapier ,你说得对,但是,我需要继续使用之前编写的代码,这就是我必须这样做的原因。
标签: ios uiview core-graphics cgcontextref