animação simples através do desenho atrasada
-
22-08-2019 - |
Pergunta
Eu estou tentando implementar algumas muito simples animação desenho de linha para o meu iPhone app. Eu gostaria de chamar um retângulo na minha opinião depois de um atraso. Estou usando performSelector
para executar o meu método de desenho.
-(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);
}
Qual é então invocado via:
int col = 10;
[self performSelector:@selector(drawRowAndColumn:)
withObject:[NSNumber numberWithInt:col]
afterDelay:0.2];
Mas parece que quando a mensagem drawRowAndColumn:
realmente é enviado, já não tem acesso a um CGContextRef
válido, como eu recebo erros, tais como:
<Error>: CGContextAddRect: invalid context
Se eu substituir o performSelector
com uma chamada direta para drawRowAndColumn
, ele funciona bem. Assim, a minha primeira idéia era passar também no CGContextRef
através da performSelector
, mas eu não consigo descobrir como passar vários argumentos ao mesmo tempo (isso é outra boa pergunta.)
O que há de errado com código acima?
Solução
Você não pode simplesmente chamar a qualquer momento como aquele. Você precisa implementar o método drawRect:
de UIView e colocar o seu código de desenho lá.
Para obter drawRect:
ao fogo você precisa deixar Cacau saber que as necessidades vista a ser desenhado. Para que você pode chamar setNeedsDisplay
, ou setNeedsDisplayInRect:
.
Diretamente traduzir sua tentativa desta forma você chamaria setNeedsDisplay usando performSelector: withObject:. AfterDelay - mas que provavelmente não é uma boa maneira de fazer animação
Depende do que você está realmente tentando fazer - mas você poderia considerar, por exemplo, colocar o seu código de desenho em drawRect
como sugeri, mas começar a visão escondido. Você poderia então chamar setHidden: NÃO usando performSelector para fazê-lo aparecer após um atraso - ou você poderia sem problemas animá-lo em iniciando não escondido, mas com um alfa de 0, em seguida, mudar alfa para 1 dentro de um bloco de animação UIView (há muito sobre isso nos docs).