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.

Foi útil?

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.

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