Linea viene cancellata quando si disegnano forme
Domanda
Sto cercando di fare una domanda per disegnare forme sullo schermo toccandolo.
posso tracciare una linea da un punto ad un altro- ma cancella su ogni nuova estrazione.
Qui è il mio codice:
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;
}
Apprezzare il vostro aiuto -
Nir.
Soluzione
Come avete scoperto, -drawRect è dove si visualizza il contenuto di una vista. Sarà solo 'vedere' sullo schermo ciò che si disegna qui.
Questo è molto più basso livello di qualcosa di simile a Flash in cui si potrebbe aggiungere un movieclip che contiene una riga sul palco e qualche tempo dopo aggiungere un altro clip filmato che contiene una linea per il palco e ora si vede - due linee!
Sarà necessario fare un certo lavoro e prdobably configurare qualcosa di simile ..
- (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];
}
Penso che si può vedere come carne questo fuori per quello che ti serve.
Un altro modo per avvicinarsi a questo è quello di utilizzare CALayers. Usando questo approccio voi non disegnare all'interno - - (void) drawRect a tutti - si aggiungere e rimuovere gli strati, disegnare quello che ti piace al loro interno, e la vista sarà gestirli compositing insieme e disegnare sullo schermo in base alle esigenze. Probabilmente più quello che stai cercando.
Altri suggerimenti
Ogni volta che drawRect
si chiama, si inizia con una tabula rasa. Se non tenere traccia di tutto ciò che avete disegnato prima, al fine di richiamare di nuovo, poi si finisce solo disegnare l'ultimo colpo di un dito, e non uno qualsiasi dei vecchi. Si dovrà tenere traccia di tutti i tuoi colpi delle dita al fine di ridisegnare ogni volta drawRect
è chiamato.
Invece di ridisegnare ogni linea, è possibile disegnare in un'immagine e poi basta visualizzare l'immagine nel metodo drawRect:
. L'immagine si accumulano le linee per voi. Naturalmente, questo metodo rende annullare più difficile da attuare.
Da Guida Application Programming iPhone :
Utilizza l'UIGraphicsBeginImageContext funzione per creare una nuova immagine-based contesto grafico. Dopo aver creato questo contesto, è possibile disegnare l'immagine contenuti in esso e quindi utilizzare il UIGraphicsGetImageFromCurrentImageContext funzione di generare un'immagine in base quello che hai disegnato. (Se lo si desidera, è possibile anche continuare a disegnare e generare altre immagini.) quando si è fatto la creazione di immagini, utilizzare la funzione di UIGraphicsEndImageContext chiudere il contesto grafico. Se tu preferiscono utilizzare core grafico, si può utilizzare la funzione CGBitmapContextCreate per creare un contesto grafica bitmap e disegnare i contenuti di immagini in esso. Una volta terminato il disegno, utilizzare il funzione di CGBitmapContextCreateImage creare un CGImageRef dal bitmap contesto. È possibile disegnare il Core immagine grafica direttamente o utilizzare questo per inizializzare un oggetto UIImage.