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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top