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

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

ответ

3

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

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

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

+0

Я знал, что это было просто, спасибо! –

+1

Что такое * хороший способ сделать анимацию? – mk12

+0

Использование Core Animation, или более высокоуровневая оболочка на основе UIView. Вот о чем говорил последний абзац в моем ответе (блок анимации UIView). Вы запускаете блок анимации, устанавливаете некоторые свойства UIView, затем фиксируете анимацию, а изменения свойств будут анимированы (вы можете контролировать время и т. Д.). – philsquared

Смежные вопросы