Ho un UIView personalizzato che disegna qualcosa in una sovrascrittaiOS disegno in CALayers drawInContext è o sgranata o sfocata sulla retina
- (void)drawRect:(CGRect)rect
questo funziona bene e dà risultati nitide su schermi retina.
Tuttavia, ora desidero rendere animabili le proprietà su cui è basato il disegno. Creazione di proprietà animatable sembra essere possibile solo sulla CALayer, così invece di fare il disegno in UIView, creo un CALayer sottoclasse personalizzata e fare il disegno all'interno
- (void) drawInContext:(CGContextRef)ctx
Io uso più o meno lo stesso codice esatto disegno in questo funzione come ho usato nella funzione drawRect della UIView personalizzata.
Il risultato sembra lo stesso - tuttavia, non è la risoluzione della retina, ma pixel nell'immagine (grandi pixel quadrati)
se metto
self.contentsScale = [UIScreen mainScreen].scale;
Per l'inizio della mia implementazione drawInContext, allora invece di un pixel risultato, ottengo un risultato sfocato (come se il rendering fosse ancora eseguito in risoluzione non retina e quindi upscalizzato alla risoluzione della retina).
qual è il modo corretto per rendere nitidi i percorsi della retina in CALYers drawInContext?
Ecco alcuni screenshot (la linea blu è parte del disegno personalizzato in discussione la parte gialla è solo un'immagine.)
Drawn all'interno drawRect personalizzato di UIView:
Drawn all'interno drawInContext dell'abitudine CALayer:
Drawin all'interno drawInContext personalizzato di CALayer, con l'impostazione self.contentScale prima:
Per completezza, ecco (una versione ridotta del) codice di disegno:
//if drawing inside custom UIView sublcass:
- (void)drawRect:(CGRect)rect
{
CGContextRef currenctContext = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextSetLineWidth(currenctContext, _lineWidth);
CGContextSetLineJoin(currenctContext,kCGLineJoinRound);
CGContextMoveToPoint(currenctContext,x1, y1);
CGContextAddLineToPoint(currenctContext,x2, y2);
CGContextStrokePath(currenctContext);
}
//if drawing inside custom CALayer subclass:
- (void) drawInContext:(CGContextRef)ctx {
{
//self.contentsScale = [UIScreen mainScreen].scale;
CGContextRef currenctContext = ctx;
CGContextSetStrokeColorWithColor(currenctContext, [UIColor blackColor].CGColor);
CGContextSetLineWidth(currenctContext, _lineWidth);
CGContextSetLineJoin(currenctContext,kCGLineJoinRound);
CGContextMoveToPoint(currenctContext,x1, y1);
CGContextAddLineToPoint(currenctContext,x2, y2);
CGContextStrokePath(currenctContext);
}
per ribadire ciò che voglio raggiungere : Voglio ottenere lo stesso rendering della retina nitido come nell'approccio UIView, ma durante il rendering in CALayer
nella retina display, è necessario moltiplicare l'altezza e la larghezza per 2. – Bejibun
no, la dimensione e la posizione sullo schermo è corretta – user1282931
intendo lo schermo devi solo creare moltiplicato per 2, perché il display retina richiede una doppia risoluzione. – Bejibun