2012-11-10 11 views
5

UIView alt sınıfım karmaşık bir görüntü oluşturmak için alt katmanların yaygın kullanımını yaygınlaştırır. Ekranda ve bir iPad 2'de bu görünümlerin en fazla 30'ı var. PerimetrePath boyunca (perimetreLayer'in yol özniteliği olan) animasyonların performansı acı çekiyordu.Bir CALayer'ı görüntü bağlamına dönüştürmek siyahlığı döndürüyor

Aslen yapıtaşlarımı görünümümün katmanına alt katman olarak ekledim.

[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) 

Ekrandaki görüntü mükemmeldir. Ancak animasyonlar gecikmeye başladığından beri, geçici kodu bir bitmap haline getirme niyetiyle geçici bir katman oluşturmak için bu kodu hazırladım. Birinci adım Biraz varolan kodu yeniden işleme olabilir sağlamak içindi:

Beklendiği gibi
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]; 

, bu işe yarıyordu.

sonraki adım sonra tüm bu katmanların bir ön-işlenmiş versiyonunu üretmek olacaktır:

// [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]; 

Bunun sonucu denedim yüzden sonraki ekranda siyah dikdörtgenler oldu:

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

Aynı zamanda bana siyah dikdörtgenler verdiğinden, ekranda siyah dikdörtgenler elde etme yönteminin iyi çalıştığını söyleyebilirim ;-) ama bir şekilde üst katmanın bitmap grafik bağlamına dönüşmesini sağladık.

Yeni bağlamın başlangıcı olan YES vs NO, 1.0'a karşı 0.0 seçeneğinin seçenekleri ile uğraşmaya çalıştım; Hepsi boşuna. Bu bağlamda

görüntüyü almak

  • Bu bağlamda
  • içine benim katmanı çizmek yeni grafik içerik başlamak

    • :

      Ne sürecinde eksik?

      Teşekkürler!

  • cevap

    9

    Ne yapamadığımı buldum: katmam hiç içeriğini çizmemişti, bu yüzden görüntüyü elde etmeye çalışmadan önce katmana setNeedsDisplay göndermem gerekiyordu (ki bu da benim gibi yöntem isimleriyle biraz garip görünüyor) drawLayer: InContext: ve renderInContext:) iOS 6'da bazen

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

    iyi iş ama garip işaretçileri işleri için çalışmaz.

    gelecekte :) bu yardım birisi

    UIGraphicsBeginImageContextWithOptions([tmpLayer frame].size, YES, 0.0); 
    [tmpLayer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    
    (kod Bölüm I Todd Yandell tarafından stackoverflow powever bulunur) umut
    İlgili konular