Управление слоем iPhone - передовая практика

Луи - Спасибо за ваш вклад. Вот что я сделал и мои текущие проблемы, которых я не понимаю.

Меню (2) - это UIImageView, которые реагируют на прикосновения. Каждый - это свой класс. «Спрайты», как вы их назвали, тоже реагируют на прикосновения.

В .m, где я добавляю меню и спрайты к слою, я создал два слоя-контейнера с помощью этого кода: menuContainer = [CALayer layer].

Я заказал их с menuContainer над spriteContainer. Теперь спрайты перемещаются под меню - отлично! Но в процессе спрайты перестали реагировать на прикосновения (я могу это понять, поскольку они находятся под слоем menuContainer), и меню перестали реагировать на прикосновения (не понимаю). Продолжая запутывать ситуацию, слой, добавленный в menuContainer, который реагирует на жест мультитач, выскакивая ползунок, по-прежнему считывает мультитач и выскакивает ползунок, но я не могу сдвинуть ползунок. Это меня полностью сбило с толку.

Спасибо.

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

Моя проблема в том, что я хочу, чтобы мои слои меню (их 4) всегда находились перед другими слоями. Я подумал о создании иерархии слоев и использовании метода inserttsublayer: atindex:, сделав мои меню условным индексом 1000 и вставив множество движущихся слоев с более низким индексом, например 200. Если я вставлю один слой с номером 200, а затем следующий на 200, смещается ли первый слой, назначенный на 200 (на 201), или он сдувается?

Я пробовал вставлять слои с помощью inserttsublayer: below :, но это не дало мне желаемых результатов.

Спасибо за помощь.


person KLC    schedule 17.11.2009    source источник
comment
Это хороший вопрос. Мне также интересно, почему Apple просто не включила механизм Z-упорядочения в форме свойства Z-координаты.   -  person Amagrammer    schedule 18.11.2009
comment
Предполагая, что вы говорите о CoreAnimation-Layers, вы обнаружите, что на самом деле существует свойство zPosition и, кроме того, есть свободно настраиваемый CATransform3D. НО, оба эти свойства учитываются только для братьев и сестер. Следовательно, CoreAnimation нельзя использовать, если вам нужны полноценные 3D-объекты / анимации. Это порядок вставки, который учитывается для того, какой слой будет нарисован поверх или под другим.   -  person Till    schedule 18.11.2009
comment
На самом деле, если вы поместите несколько слоев в CATransformLayer, вы сможете воспроизвести некоторые довольно сложные трехмерные эффекты. Единственное реальное ограничение с точки зрения трехмерности состоит в том, что CAL-слои должны быть прямоугольными.   -  person Brad Larson    schedule 18.11.2009


Ответы (2)


Вы действительно не можете этого сделать, индекс слоя - это не z-порядок, это индекс массива. Из документация:

Это значение не должно быть больше количества элементов в массиве подуровня.

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

Дополнительные материалы на основе ваших правок:

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

person Louis Gerbarg    schedule 17.11.2009
comment
Луис, я подумал о том же из этого комментария в документации, но в соответствии с геометрией слоя и страницей преобразований на сайте документации: свойство zPosition определяет компонент оси z положения слоя. Параметр zPosition предназначен для установки визуального положения слоя относительно его родственных слоев. Его не следует использовать для указания порядка братьев и сестер уровня, вместо этого переупорядочивайте слой в массиве подуровней. что мне подсказывает, что индекс слоя имеет z-порядок. Я написал небольшой код, чтобы подтвердить это, и, похоже, это так. - person Matt Long; 19.11.2009
comment
Полагаю, я был не совсем ясен. Индекс абсолютно определяет, что отображается поверх чего, так что в некотором смысле это z-порядок. Но это не общий z-порядок в том смысле, что вы не можете установить для них произвольные значения и ожидать, что они будут упорядочены последовательно на основе этого, индексы различных слоев будут меняться по мере того, как вы вставляете другие слои. - person Louis Gerbarg; 19.11.2009

Луи - Спасибо за ваш вклад. Вот что я сделал и мои текущие проблемы, которых я не понимаю.

Меню (2) - это UIImageView, которые реагируют на прикосновения. Каждый - это свой класс. «Спрайты», как вы их назвали, тоже реагируют на прикосновения.

В .m, где я добавляю меню и спрайты к слою, я создал два слоя-контейнера с помощью этого кода: menuContainer = [CALayer layer].

Я заказал их с menuContainer над spriteContainer. Теперь спрайты перемещаются под меню - отлично! Но в процессе спрайты перестали реагировать на прикосновения (я могу это понять, поскольку они находятся под слоем menuContainer), и меню перестали реагировать на прикосновения (не понимаю). Продолжая запутывать ситуацию, слой, добавленный в menuContainer, который реагирует на жест мультитач, выскакивая ползунок, по-прежнему считывает мультитач и выскакивает ползунок, но я не могу сдвинуть ползунок. Это меня полностью сбило с толку.

Спасибо.

person KLC    schedule 18.11.2009
comment
На самом деле это не ответ; это должно быть редактирование вашего вопроса. - person Sixten Otto; 18.11.2009