2012-11-10 6 views
5

Meine Unterklasse von UIView verwendet umfangreiche Sublayer, um ein komplexes Bild zu erstellen. Es gibt bis zu 30 dieser Ansichten auf dem Bildschirm und auf einem iPad 2 leidet die Performance von Animationen entlang des perimeterPath (welches das Pfadattribut der perimeterLayer ist).Das Rendern eines CALayers an einen Bildkontext führt zur Schwärzung

Ursprünglich habe ich nur die konstituierenden Schichten als Unterschichten auf der Ebene meiner Ansicht hinzugefügt.

[self.layer addSublayer:self.leftsideLayer]; // CAShapeLayer 
[self.layer addSublayer:self.rightsideLayer]; // CAShapeLayer 
[self.layer addSublayer:self.perimeterLayer]; // CAShapelayer 
[self.layer addSublayer:self.valueLayer];  // CAShapeLayer 
[self.layer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask) 

Der Bildschirm Render ist perfekt. Aber da die Animationen zu verzögern begannen, bereitete ich diesen Code zum Erstellen einer temporären Ebene mit der Absicht vor, die temporäre Ebene in eine Bitmap umzuwandeln. Der erste Schritt bestand darin, sicherzustellen, dass ich den vorhandenen Code leicht überarbeiten konnte:

CALayer *tmpLayer = [CALayer layer]; 
[tmpLayer addSublayer:self.leftsideLayer]; // CAShapeLayer 
[tmpLayer addSublayer:self.rightsideLayer]; // CAShapeLayer 
[tmpLayer addSublayer:self.perimeterLayer]; // CAShapelayer 
[tmpLayer addSublayer:self.valueLayer];  // CAShapeLayer 
[tmpLayer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask) 
[self.layer addSublayer:tmpLayer]; 

Wie erwartet, das hat gut funktioniert.

Der nächste Schritt wäre dann eine vorgerenderten Version von all diesen Schichten zu erzeugen:

// [self.layer addSublayer:tmpLayer]; 
    UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [self drawLayer:tmpLayer inContext:ctx]; 
    UIImage *renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext(); 
    if (!renderedImageOfMyself) { 
     NSLog(@"Well that didn't work"); 
    } 
    UIGraphicsEndImageContext(); 
    [self.layer setContents:renderedImageOfMyself.CGImage]; 

Das Ergebnis war die schwarze Rechtecke auf dem Bildschirm, so dass beim nächst Ich habe versucht:

// [self.layer setContents:renderedImageOfMyself.CGImage]; 
[self addSubview:[[UIImageView alloc] initWithImage:renderedImageOfMyself]]; 

Da das auch mir schwarze Rechtecke gibt, habe ich festgestellt, dass eine der Methoden, schwarze Rechtecke auf dem Bildschirm zu bekommen, gut funktioniert ;-) aber ich habe es irgendwie vermasselt, die oberste Ebene in einen Bitmap-Grafikkontext zu rendern.

Ich habe versucht, mit den Optionen Teil des Beginns der neuen Kontext, YES vs NO, 1.0 versus 0.0; alles vergebens.

Was bin ich in den Prozess der:

  • eine neue Grafik beginnen Kontext
  • meine Schicht in das aus diesem Zusammenhang

  • bekommen das Bild Kontext ziehen?

    Danke!

  • Antwort

    9

    Nun, ich fand, was ich nicht tat: meine Ebene hatte nie ihren Inhalt gezeichnet, also musste ich setNeedsDisplay an die Ebene senden, bevor ich versuchte, das Bild daraus zu bekommen (was mir mit Methodennamen wie drawLayer: InContext: und renderInContext:)

    [tmpLayer setNeedsDisplay]; 
    UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [tmpLayer renderInContext:ctx]; 
    renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [self.layer setContents:renderedImageOfMyself.CGImage]; 
    
    2

    gute Arbeit geleistet, aber manchmal auf iOS 6 funktioniert nicht für seltsame Zeiger funktioniert.

    Ich hoffe, dass diese Hilfe jemand in der Zukunft :) (Teil des Code, den ich auf Stackoverflow powever von Todd Yandell gefunden)

    UIGraphicsBeginImageContextWithOptions([tmpLayer frame].size, YES, 0.0); 
    [tmpLayer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    
    Verwandte Themen