Простая анимация с помощью отложенного рисования

StackOverflow https://stackoverflow.com/questions/694905

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top