2

我正在尝试为我的 iPhone 应用程序实现一些非常简单的线条绘制动画。我想在延迟后在我的视图上绘制一个矩形。我正在使用performSelector运行我的绘图方法。

-(void) drawRowAndColumn: (id) rowAndColumn
{
    int rc = [rowAndColumn intValue];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
    CGRect rect = CGRectMake(rc * 100, 100, 100, 100);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context, kCGPathFillStroke);

}

然后通过以下方式调用:

int col = 10;
[self performSelector:@selector(drawRowAndColumn:) 
           withObject:[NSNumber numberWithInt:col]
           afterDelay:0.2];

但似乎在drawRowAndColumn:实际发送消息时,它不再有权访问有效的CGContextRef,因为我收到以下错误:

<Error>: CGContextAddRect: invalid context

如果我用performSelector直接调用替换drawRowAndColumn,它工作正常。所以我的第一个想法是也传递CGContextRefvia performSelector,但我似乎无法弄清楚如何同时传递多个参数(这是另一个好问题。)

上面的代码有什么问题?

4

1 回答 1

3

你不能像那样在任何时候画画。您需要实现drawRect:UIView 的方法并将您的绘图代码放在那里。要drawRect:启动,您需要让 Cocoa 知道需要绘制视图。为此,您可以调用setNeedsDisplay, 或setNeedsDisplayInRect:

以这种方式直接翻译您的尝试,您可以使用 performSelector:withObject:afterDelay 调用 setNeedsDisplay - 但这可能不是制作动画的好方法。

这取决于您真正想要做什么 - 但您可以考虑,例如,drawRect按照我的建议放入您的绘图代码,但开始隐藏视图。然后,您可以使用 performSelector 调用 setHidden:NO 使其在延迟后出现 - 或者您可以通过开始不隐藏但 alpha 为 0 来平滑地对其进行动画处理,然后在 UIView 动画块中将 alpha 更改为 1(有很多关于这在文档中)。

于 2009-03-29T17:12:47.753 回答