2012-06-18 11 views
9

Mam widok z podłożem CATiledLayer. Chcę wziąć widoczne kafelki z tego UIView CATiledLayer UIView i dodać je do innego widoku jako jego wsparcie CALayer, odtwarzając w ten sposób widoczny obraz w innym UIView, który nie używa CATiledLayer.CATiledLayer to CALayer

Powodem, dla którego chcę to zrobić, będę używał tego drugiego UIView, aby zamaskować efekt aktualizacji UIView wspieranego CATiledLayer - obecnie wytwarza migotanie, ponieważ wszystkie płytki są ponownie ładowane.

Problem polega na tym, że nie jestem całkowicie pewien, jak to zrobię. Jakieś pomysły?

+1

więc chcesz wziąć widok celowo kaflowy i zrobić normalnego widoku, aby ukryć widok kafelki ...? Może szalone pytanie, ale dlaczego było to na początku kafelki? –

+0

@PauldeLange - Kiedy mój kafelkowany widok zostanie ponownie załadowany, "migocze", gdy płytki są rysowane ponownie. Pod widokiem na kafelki pojawi się UIView, który będzie bezpośrednią kopią powyższych płytek. Następnie, gdy płytki są ponownie ładowane, widok z dołu będzie wyświetlany przez ułamek sekundy, gdy płytki zostaną ponownie załadowane, co zatrzyma migotanie. Z tego co mogę powiedzieć, jest to dość powszechna praktyka w programach graficznych - użycie bufora graficznego w celu wygładzenia wpływu renderowania dowolnej nowej treści powyżej. –

+0

Jeśli możesz renderować widok tła szybciej niż kafelki, dlaczego masz płytki? afekt -> efekt przy okazji. –

Odpowiedz

3

CATiledLayer jest podklasą CALayer zapewniając możliwość asynchronicznie zapewniają płytki o zawartości warstwy, potencjalnie buforowane na wielu poziomach szczegółowości.

można uczynić rzeczy widzialnych w warstwie do CGContextRef z:

- (void)renderInContext:(CGContextRef)ctx 

a następnie użyj tego, aby zaktualizować inną warstwę o ustawieniach swojego delegata i wdrożenie

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

ss pokazane tutaj http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Ale szczerze mówiąc nie sądzę, że jest to skuteczne.

+0

Dzięki za odpowiedź. Mówisz, że to nie jest wydajne. Czy masz jakieś inne pomysły, które mogą pomóc w rozwiązaniu mojego problemu z migotaniem? –

+0

@Luis 'renderInContext' nie działa na' CATiledLayer', jak robi to 'CALayer'. Płytki nie renderują się wcale. Jakieś pomysły? – Tim

0

Twoim rzeczywistym problemem jest migotanie. Miałem podobny problem w widoku z niestandardowych CALayer wzbogacić ją, to był częścią rozwiązania: utworzyć niestandardowy podklasy swojej CALayer i wdrożyć następujące metody:

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

Ten stały zestaw problemów do mnie, ale może tego nie naprawić. Alternatywą dla ciebie może być wyłączenie transakcji podczas aktualizacji: Od CATransaction Class Reference

setDisableActions: Zestawy czy działania wywołane wskutek zmian własności dokonane w ramach tej grupy transakcji są tłumione.

więc korzystać z tego:

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