Подсчеты учитываются в подуровнях корневого CALayer? - PullRequest
2 голосов
/ 15 июля 2010

Я заметил сегодня, когда добавляю 1 CALayer и 2 подпредставления к моему представлению, когда я запускаю следующий код в моем экземпляре UIView:

[self.layer.sublayers count]

Это возвращает 3.Означает ли это, что подпредставление также считается подуровнем?Если бы я хотел получить только те CALayers, которые я нарисовал в своем вызове sublayers, как бы я это сделал?

Ответы [ 3 ]

3 голосов
/ 15 июля 2010

Да, у каждого UIView есть базовый CALayer, который добавляется к слою его суперпредставления, когда представление добавляется к суперпредставлению.

Я не знаю идеального способа найти только свои собственные слои. Поскольку sublayers является NSArray (в отличие от NSSet), это означает, что это упорядоченный список, что означает, что вы можете быть уверены, что порядок добавления представлений в суперпредставление соответствует порядку их появления. в указанном массиве.

Таким образом, если вы сначала добавите свои UIViews, а затем добавите свои собственные нарисованные CALayers, вы, вероятно, сможете получить свои собственные, получив доступ к объектам, начиная с индекса 2 (пропуская 0 и 1) в sublayers.

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

Вы можете определить индекс для слоя при его добавлении, используя indexOfObject: в свойстве sublayers. Более безопасный путь может заключаться в том, чтобы просто сохранить этот индекс где-то в списке и получить доступ к подуровням только с индексами из этого списка.

1 голос
/ 01 декабря 2012

Из документации CALayer:

делегат

Указывает объект делегата получателя.

@ свойство (назначить) идентификатор делегата

Обсуждение

В iOS, если слой связан с объектом UIView, это свойство должно быть установлено на представление, которому принадлежит слой.

Наличие

Доступно в OS X v10.5 и более поздних версиях.

Пример кода

1 голос
/ 02 марта 2012

Если бы я хотел, чтобы CALayers, которые я нарисовал в своем вызове подслоев, как бы я это сделал?

Вы можете сделать это, сделав представление, которое в данный момент является подпредставлениемиз self в одноуровневое представление, когда они оба будут подпредставлениями в содержащем представлении.Тогда ваш текущий self.layer.sublayers будет просто содержать CALayers, которые вы добавили вручную.

Один из способов думать об этом - это иерархия слоев, не иерархия представления который определяет иерархию рендеринга.Иерархия представления - это просто оболочка для обработки интерактивности, которую UIView добавляет к своей базовой графике CALayer.Таким образом, когда вы добавляете подпредставление к представлению, оно одновременно, хотя и в некотором смысле независимо, добавляет свой слой в качестве подслоя к слою представления.Вы могли бы переопределить эту функциональность в подклассе или категории в UIView ...

...