2009-11-17 4 views
0

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

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

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

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

Спасибо.

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

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

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

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

+1

Это хороший вопрос. Я также задаюсь вопросом, почему Apple не просто включила механизм Z-упорядочения в виде свойства Z-координат. – Amagrammer

+1

Предполагая, что вы говорите о CoreAnimation-Layers, вы обнаружите, что на самом деле есть свойство zPosition, а также есть свободно настраиваемый CATransform3D. НО, оба этих свойства учитываются только у братьев и сестер. Следовательно, CoreAnimation нельзя использовать, если вам нужны полноценные 3D-объекты/анимации. Это порядок вставки, который учитывает, какой слой нарисован поверх или под другим. – Till

+0

На самом деле, если вы поместите кучу слоев внутри CATransformLayer, вы можете воспроизвести некоторые довольно сложные трехмерные эффекты. Единственным реальным ограничением, 3-D-мудрый, является то, что CALayers должны быть прямоугольными. –

ответ

2

Вы не можете этого сделать, индекс слоя не является z-порядком, это индекс массива. От documentation:

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

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

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

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

+0

Луи, я думал о том же, что и в этом комментарии в документации, но в соответствии с геометрией слоя и преобразует страницу на сайт doc: «Свойство zPosition указывает компонент оси z в позиции слоя. Цель zPosition используется для установки визуального положения слоя относительно его родственных слоёв. Его нельзя использовать для указания порядка братьев-сикверов, вместо этого переупорядочивать слой в массиве подуровня ». что для меня предполагает, что индекс слоя * является * z-порядком. Я написал небольшой код, чтобы подтвердить это, и, похоже, это так. –

+0

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

-1

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

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

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

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

Спасибо.

+0

На самом деле это не ответ; это должно быть редактирование вашего вопроса. –