A linha é apagada ao desenhar formas
Pergunta
Estou tentando fazer um aplicativo para desenhar formas na tela tocando -o.
Eu posso desenhar uma linha de um ponto para outro- mas ela apaga em cada novo empate.
Aqui está o meu código:
CGPoint location;
CGContextRef context;
CGPoint drawAtPoint;
CGPoint lastPoint;
-(void)awakeFromNib{
//[self addSubview:noteView];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
[[UIColor blueColor] set];
CGContextSetLineWidth(context,10);
drawAtPoint.x =location.x;
drawAtPoint.y =location.y;
CGContextAddEllipseInRect(context,CGRectMake(drawAtPoint.x, drawAtPoint.y, 2, 2));
CGContextAddLineToPoint(context,lastPoint.x, lastPoint.y);
CGContextStrokePath(context);
lastPoint.x =location.x;
lastPoint.y =location.y;
}
Agradeço sua ajuda-
Nir.
Solução
Como você descobriu, -Drawrect é onde você exibe o conteúdo de uma visualização. Você só vai 'ver' na tela o que você desenha aqui.
Isso é muito mais baixo do que algo como o Flash, onde você pode adicionar um Movieclip contendo uma linha ao palco e, algum tempo depois, adicione outro movimento contendo uma linha ao palco e agora você vê - duas linhas!
Você precisará fazer algum trabalho e configurar prdobavelmente algo como ..
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self addNewLineFrom:lastPoint to:location];
lastPoint = location;
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
for( Line *eachLine in lineArray )
[eachLine drawInContext:context];
}
Eu acho que você pode ver como aprofundar isso para o que você precisa.
Outra maneira de abordar isso é usar calayers. Usando essa abordagem, você não desenha dentro - - (void) drawrect - você adiciona e remove camadas, desenhe o que gosta dentro delas e a exibição lidará com a composição e desenhe para a tela conforme necessário. Provavelmente mais o que você está procurando.
Outras dicas
toda vez que drawRect
é chamado, você começa com uma lousa em branco. Se você não acompanhar tudo o que desenhou antes, a fim de desenhá -lo novamente, acaba desenhando apenas o último golpe do seu dedo, e não qualquer um dos antigos. Você terá que acompanhar todos os seus golpes de dedo para redesenhá -los todas as vezes drawRect
é chamado.
Em vez de redesenhar todas as linhas, você pode atrair uma imagem e depois exibir a imagem em seu drawRect:
método. A imagem acumulará as linhas para você. Obviamente, esse método torna a desfazer mais difícil de implementar.
De Guia de programação de aplicativos para iPhone:
Use a função UIGRAPHICSBEGINIMAGECONTEXT para criar um novo contexto gráfico baseado em imagem. Depois de criar esse contexto, você pode atrair o conteúdo da sua imagem e usar a função UIGRAPHICSGETIMAGEFROMCURINGIMAGECONTEXT para gerar uma imagem com base no que você desenhou. (Se desejar, você pode continuar desenhando e gerar imagens adicionais.) Quando terminar de criar imagens, use a função uigraphicSendImageContext para fechar o contexto gráfico. Se você preferir usar gráficos principais, você pode usar a função CGBITMAPCONTEXTCREATE para criar um contexto gráfico de bitmap e desenhar o conteúdo da sua imagem para ele. Ao terminar o desenho, use a função CGBITMAPCONTEXTCREATEIMAGE para criar um CGIMAGEREF a partir do contexto do bitmap. Você pode desenhar a imagem gráfica principal diretamente ou usá -la para inicializar um objeto UIImage.