ich eine benutzerdefinierte UIView, die etwas in einem überschriebeniOS in CALayers drawInContext Zeichnung ist entweder pixelig oder verschwommen auf Retina
- (void)drawRect:(CGRect)rect
das funktioniert gut und gibt scharfe Ergebnisse auf Retina-Bildschirme zieht.
Jetzt möchte ich jedoch die Eigenschaften, auf denen die Zeichnung basiert animiert werden. animierbaren Eigenschaften Erstellen scheint möglich zu sein, nur auf der CALayer, so dass anstelle die Zeichnung in UIView zu tun, erstelle ich eine benutzerdefinierte CALayer Unterklasse und führen Sie die Zeichnung im Innern
- (void) drawInContext:(CGContextRef)ctx
verwende ich ziemlich genau die gleichen Zeichencode in diesem Funktion wie ich in der DrawRect-Funktion der benutzerdefinierten UIView verwendet.
Das Ergebnis sieht genauso aus - aber es ist nicht Retina-Auflösung aber pixelig (großer quadratischer Pixel)
wenn ich
self.contentsScale = [UIScreen mainScreen].scale;
Zu Beginn meiner drawInContext Umsetzung setzen, dann anstelle einem pixelig Ergebnis, bekomme ich ein unscharfes Ergebnis (als ob das Rendering immer noch in Nicht-Retina-Auflösung durchgeführt wird und dann auf Retina-Auflösung hochskaliert wird).
Was ist die korrekte Methode zum Rendern von scharfen Retina-Pfaden in CALayers drawInContext?
sind hier einige Screenshots (die blaue Linie Teil der benutzerdefinierten Zeichnung in Frage ist das gelbe Teil nur ein Bild ist.) DrawRect
Gezeichnet innerhalb benutzerdefinierten UIView suchen:
innen Gezeichnet benutzerdefinierte CALayer des drawInContext:
Drawin zuerst innerhalb benutzerdefinierter CALayer des drawInContext, mit self.contentScale Einstellung:
Für Vollständigkeit, hier ist (eine abgespeckte Version des) Zeichencode:
//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);
}
neu zu formulieren, was ich will erreichen : Ich möchte das gleiche knackige Retina-Rendering wie im UIView-Ansatz erzielen, aber beim Rendern in CALayer
in Retina-Display, müssen Sie durch 2. – Bejibun
nicht die Höhe und Breite multiplizieren, die Größe und die Position auf dem Bildschirm korrekt – user1282931
meine ich den Bildschirm Sie sollten nur mit 2 multipliziert werden, weil Retina-Display doppelte Auflösung benötigt. – Bejibun