Управление слоями iPhone - лучшая практика - PullRequest
0 голосов
/ 18 ноября 2009

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

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

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

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

Спасибо.

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

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

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

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

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

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

0 голосов
/ 18 ноября 2009

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

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

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

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

Спасибо.

...