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