Управляющая раскладка подслоев NSView с применением преобразований - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать подкласс NSView, который может дать мне доступ к слою, для которого я могу управлять такими параметрами, как обычно запрещенные, как anchorPoint и transform, а также применять анимацию.

My планировалось создать представление размещения слоя, а затем добавить подслой к слою root. Это работает отлично, за исключением того, что мне очень трудно позиционировать и определять размер этого подслоя. Я чувствую, что упускаю что-то очевидное, но не могу понять.

Моя первая попытка состояла в том, чтобы установить layoutManager слоя root на CAConstraintLayoutManager. Это прекрасно работает , если Я не установил свойство подслоя transform. CAConstraintLayoutManager обновляет фрейм слоя напрямую, и это вызывает проблемы с преобразованиями вращения. У меня ушло навсегда, чтобы понять это, но я в конечном итоге нашел документацию , которая объясняет это.

Хорошо, так что теперь я сделал пользовательский CALayoutManager, который просто настраивает подслой bounds и position вместо смены кадра. Кажется, это работает, но портит макет, если у моего представления есть подпредставления. Это удивило меня. Я предполагаю, что это мешает внутренней системе макета NSView, когда задействованы другие слои?

Итак, я перешел к использованию root метода делегирования слоя func layoutSublayers(of layer: CALayer). Это также портит компоновку, так как я не осознавал, что NSView сам по себе ожидает быть делегатом слоя root и использует этот метод специально.

Так что на данный момент я в растерянности. Я не могу понять, как управлять макетом и , а также применить преобразование к подслою. У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 18 января 2020

Оказывается, есть очевидный ответ на этот вопрос. NSView имеет метод layout, который идеально подходит для этого. Я экспериментировал с этим на раннем этапе, но мой код был в плохом состоянии, и по другим причинам ничего не работало. Как только я удалил все эксперименты / полкомментированный код, все заработало отлично!

...