2012-06-18 31 views
9

CATiledLayer desteğiyle ilgili bir görünüm var. Görünen karoları bu CATiledLayer UIView'den almak ve onu CALayer desteği olarak başka bir görünüme eklemek istiyorum, böylece görünür görüntüyü CATiledLayer kullanmayan başka bir UIView'de yeniden oluşturmak istiyorum.CATfulLayer to CALayer

Bunu yapmak istediğimden, bu ikinci UIView'i, CATiledLayer destekli UIView'yi güncellemenin etkisini gizlemek için kullanacağım - bu, tüm döşemeler yeniden yüklendikçe, şu anda bir titreşim oluşturuyor.

Sorun şu ki, bunu nasıl yapacağımı tam olarak bilmiyordum. Herhangi bir fikir?

+1

Yani bir kasten kiremitli bir görünüm alır ve kiremitli görünümünü gizlemek için normal bir görünüm yapmak istiyorum ...? Belki de çılgın bir soru ama niçin başlamıştı? –

+0

@PauldeLange - Döşenmiş görünümüm yeniden yüklendiğinde, karolar yeniden çizilirken 'titretir'. Yukarıdaki çinilerin doğrudan bir kopyası olacak olan döşemenin altında bir UIView olacaktır. Daha sonra karolar yeniden yüklendiğinde, fayanslar yeniden yüklendikçe alttan görünüm, bölünmüş bir saniye boyunca gösterilecek ve böylece titreme etkisini durduracaktır. Bunu anlatabildiğim kadarıyla, grafik programları için oldukça yaygın bir uygulamadır - yukarıdaki herhangi bir yeni içeriğin oluşturulmasının etkilerini düzeltmek için bir grafik tampon kullanmak. –

+0

Arka plan görüntüsünü fayanstan daha hızlı hale getirebilirseniz, neden fayanslarınız var? etki -> etkiyi etkiler. –

cevap

3

CATiledLayer zaman uyumsuz birden fazla ayrıntı düzeyde önbelleğe potansiyel katman içeriği fayans temin için bir yol temin CALayer bir alt sınıfıdır.

Sen bir CGContextRef içine katmanında görünür şeyler işleyebilen

:

- (void)renderInContext:(CGContextRef)ctx 

Sonra ayarları tarafından kendi temsilci diğer katmanını güncellemek için kullanacağız ve uygulama

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

Burada gösterilen ss http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Ama dürüst olmak gerekirse, bunun verimli olduğunu düşünmüyorum.

+0

Cevabınız için teşekkürler. Verimli olmadığını söylüyorsun. Titreme sorunumun çözülmesine yardımcı olabilecek başka fikirleriniz var mı? –

+0

@Luis 'renderInContext',' CALayer' benim için yaptıkları gibi 'CATiledLayer' üzerinde çalışmamaktadır. Fayanslar hiç oluşmaz. Herhangi bir fikir? – Tim

0

Gerçek probleminiz burada yanıp sönüyor. Bu için sorunların bir dizi sabit

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

: aşağıdaki yöntemi sizin CALayer özel bir alt sınıfını oluşturmak ve uygulamak: Bu çözümün bir parçası oldu, onu destekleyen özel bir CALayer bir görünüme benzer bir sorun vardı ben, ama senin için düzeltemeyebilirsin. sizin için alternatif güncellemek ederken işlemlerini devre dışı bırakmak olabilir: setDisableActions

CATransaction Class Reference Gönderen: eylemler bastırılmış bu işlem grubunda yapmış mülkiyet değişikliklerin bir sonucu olarak tetiklenen takımları olsun.

Yani bu kullanmak:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit];