iPhone CALayer Порядок укладки - PullRequest
3 голосов
/ 31 марта 2010

Я использую CALayers для рисования в UITableViewCell. Я пытаюсь выяснить, как слои упорядочены с содержимым UITableViewCell. Например:

  1. Я добавляю метки в UITableViewCell в моем методе cellForRow: atIndexPath
  2. В методе drawRect UITableViewCell я рисую некоторый контент, используя текущий контекст
  3. Также в drawRect я добавляю несколько подслоев

Итак, каков был бы порядок этих элементов. Я знаю, что у меня есть zPosition на CALayers, но я не уверен, что они всегда находятся поверх любых подпредставлений UITableViewCell И я не уверен, где контент, который рисуется в drawRect, попадает в порядок. Любая помощь или ссылки на документацию было бы здорово. Я прочитал Руководство по программированию основной анимации и нигде не видел, где можно было бы ответить.

Ответы [ 2 ]

4 голосов
/ 31 марта 2010

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

Довольно легко увидеть эту иерархию, потому что вы вручную добавляете подслои к слою, когда создаете их в своем коде, вплоть до базового слоя для вашего UITableViewCell (подкласс поддерживаемого слоем UIView).

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

3 голосов
/ 31 марта 2010
  1. Ваш UITableViewCell (или производный класс) является производным от UIView. Ему принадлежит один CALayer, доступ к которому вы можете получить через свойство layer. Этот слой занимает всю область обзора. Метки UILabel, которые вы добавляете в представление своей ячейки, будут дочерними элементами UIView вашей ячейки, а их CALayer - дочерними элементами CALayer ячейки. Дочерние слои рисуются перед их родителями.
  2. Когда вы рисуете что-либо в методе drawRect UIView, CALayer, которым владеет UIView, будет поддерживаться растровым изображением. Ваши UILabels частично или полностью затеняют это растровое изображение в зависимости от того, насколько они велики.
  3. Любые дочерние слои CALay, которые вы добавляете в слой своей ячейки позже, будут родственными слоями слоев UILabel, и, поскольку вы добавили их позже, они будут добавлены под ними по умолчанию (существуют версии метода, который добавляет их, хотя и может управлять порядком) .

Обратите внимание, что рисование в UITableViewCell и одновременное использование дочерних представлений не рекомендуется по соображениям производительности. Наличие более 4 дочерних представлений / слоев не рекомендуется по той же причине.

...