是否可以在块中绘制CGContext?

时间:2016-06-18 16:45:13

标签: ios objective-c uiview cgcontext

在IOS上,我有一个NSArray存储blocks,它在UIView上绘制了一些内容,例如:

^(CGContextRef ctx) {
    // drawing rectangle
    CGRect rect = CGRectMake(0, 0, 300, 300);
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
    CGContextFillRect(ctx, rect);
    CGContextStrokeRect(ctx, rect);
};

在数组中存储了几个块,我希望在调用drawRect时执行这些块,这是我的drawRect

- (void)drawRect:(CGRect)rect {
    // execute blocks 
    for(NSDictionary * task in drawTaskQueue)
    {
        DrawTaskBlock block = [task objectForKey:@"block"];
        block(args, UIGraphicsGetCurrentContext());
    }
}

但是当我运行代码时,我确定块没有任何错误地执行,但没有任何显示。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

您的代码的问题在于您传递的块需要一个类型为CGContextRef的参数,而调用代码则传递两个参数 - argsUIGraphicsGetCurrentContext()。 / p>

由于Objective-C不检查强制转换,因此您的块最终会以错误的图形上下文运行,从而导致未定义的行为。

要解决此问题,您需要确保块的“签名”与您投射它的块类型的签名相匹配,即DrawTaskBlock。签名必须包含args参数的正确类型,即使您的块都没有使用它。