Простая анимация с задержкой рисования - PullRequest
2 голосов
/ 29 марта 2009

Я пытаюсь реализовать очень простую анимацию рисования линий для моего приложения для 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, он будет работать нормально. Поэтому моей первой идеей было также передать CGContextRef через performSelector, но я не могу понять, как передать несколько аргументов одновременно (это еще один хороший вопрос).

Что не так с кодом выше?

1 Ответ

3 голосов
/ 29 марта 2009

Вы не можете просто рисовать в любое время, как это. Вам нужно реализовать метод drawRect: UIView и поместить туда свой код для рисования. Чтобы заставить drawRect: выстрелить, вы должны сообщить Какао, что представление должно быть нарисовано. Для этого вы можете позвонить setNeedsDisplay или setNeedsDisplayInRect:.

Прямой перевод вашей попытки таким образом, как если бы вы вызывали setNeedsDisplay с помощью executeSelector: withObject: afterDelay - но это, вероятно, не очень хороший способ сделать анимацию.

Это зависит от того, что вы действительно пытаетесь сделать, но вы можете, например, добавить код для рисования в drawRect, как я и предлагал, но запустить вид скрытым. Затем вы можете вызвать setHidden: NO, используя executeSelector, чтобы он появился после задержки - или вы можете плавно анимировать его, начиная не скрытно, а с альфа-0, а затем измените альфа на 1 в блоке анимации UIView (есть много о это в документах).

...