2011-09-15 14 views
5

Wyobraź sobie małe czerwone pudełko (instancja CALayer) narysowane w lewym dolnym rogu jego warstwy nadrzędnej (która jest warstwą główną warstwy hostującej NSView).Jak zachować CALayer w tej samej pozycji podczas zmiany rozmiaru rodzica NSView?

Po zmianie ramki widoku rodzica czerwone pole powinno pozostać w tej samej pozycji na ekranie. Robię to, dostosowując pozycję względem lewego dolnego rogu widoku rodzica.

Problem polega na tym, że w niektórych przypadkach dochodzi do migotania i widzę czerwoną ramkę, która jest rysowana w lewym dolnym rogu rozszerzonej ramki, zanim zostanie pokazana we właściwej pozycji.

Założę, że zawijanie ramki i zmiana pozycji w jeden CATransaction spowodowałoby zmianę obu razem, ale to nie zawsze działa (doktorzy mówią, że za pomocą transakcji animacje rozpoczną się w tym samym czasie, ale wciąż wydaje się być czasem stanem wyścigowym).

Jak mogę dostosować ramkę rodzica NSView, zachowując warstwę podrzędną w jej postrzeganej pozycji?

Przykład i kod:

NSView and box layer

Własne pomysły:

  1. Ukryj warstwa czerwone pole, zaktualizuj pozycję, pokazać go ponownie

  2. Użyj wiązania, aby powiązać je z prawym rogiem. Problem polega na tym, że to przesunięcie może również ulec zmianie i będę musiał zaktualizować ograniczenie, które może prowadzić do tego samego problemu z migotaniem.

Odpowiedz

0

Spróbuj usunąć kod, który już zrobiłeś, aby przenieść warstwę w widoku i umieścić ją w miejscu, w którym tworzysz warstwę.

boxLayer.autoresizingMask = kCALayerMaxXMargin | kCALayerMinYMargin; 
Powiązane problemy