Изменить z-порядок подпредставлений на iPhone - PullRequest
2 голосов
/ 16 сентября 2009

Я занимаюсь разработкой игры. Я использую около 150 UIImageView для хранения графики. Я моделирую трехмерную среду, поэтому я хотел бы изменить z-порядок (насколько близко объект находится к камере).

Я знаю, что существует: [superWindow exchangeSubviewAtIndex: i withSubviewAtIndex: j];

Но по какой-то причине это не работает, некоторые подпредставления исчезают снова и снова.

Теперь я просто удаляю все подпредставления и снова добавляю их в правильном z-порядке, это нормально с 50 подпредставлениями (на 2G iphone), но с 120 это занимает полсекунды, поэтому геймплей отстой (у меня нет и 3GS так что я не пробовал там).

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

Ответы [ 5 ]

5 голосов
/ 16 сентября 2009

Документация iPhone часто предупреждает о множественных вложенных UIViews, так как после определенного момента он имеет большой удар по производительности. Если вы начинаете сталкиваться с проблемами, одним из вариантов является визуализация ваших UIViews в изображение и использование этого для уменьшения количества экранных представлений, но если вы моделируете 3D, это, вероятно, мало поможет, так как ваш составной вид будет нужно перерисовывать слишком часто.

iPhone полностью поддерживает OpenGL ES, что позволяет создавать real 3D среду. Взгляните на некоторые примеры и / или хорошую книгу по этой теме, и вы обнаружите, что гораздо проще просто использовать OpenGL.

4 голосов
/ 25 ноября 2010

Z-порядок - это артефакт того, где ваше представление появляется в списке подпредставлений вашего суперпредставления. Последнее добавленное в суперпредставление "сверху".

Таким образом, чтобы переместить вид на «сверху», вы удаляете его из суперпредставления, затем снова добавляете его, делая его последним и, следовательно, сверху.

Здесь представление перемещается на вершину z-порядка.

// move to the to in the z-order
UIView* superview = [self superview];
[self retain];
[self removeFromSuperview];
[superview addSubview:self];
[self release];

Обратите внимание на [self retain], чтобы предотвратить ваш размен, если ваше суперпредставление является единственной ссылкой на вас.

2 голосов
/ 16 сентября 2009

Если вы не хотите погружаться в OpenGL ES, как предлагает Тимоти, вы можете подумать о замене UIViews на CALayers и размещении их в CATransformLayer . CATransformLayer - новинка в iPhone OS 3.0, и она позволяет вам создавать трехмерные макеты CALayers. Затем вы можете установить свойство zPosition на ваших CALayers, чтобы найти их в плоскости Z CATransformLayer. Более подробно о трехмерном макете CALayers я рекомендую этой статье .

Вы можете даже добавить хороший эффект перспективы на весь CATransformLayer, установив элемент m34 в CATransform3D, примененном к этому слою.

Переход от UIViews к CALayers довольно прост, потому что их структуры имеют много общего.

1 голос
/ 05 мая 2012

Я знаю, что это старая версия, но вы можете изменить z-порядок с помощью метода acceptSubViewToFront.

См. Этот ответ: Как настроить пользовательский интерфейс iPhone View z index?

1 голос
/ 16 сентября 2009

Подумайте об использовании 2D-библиотеки игр, например Cocos2D . Я уверен, что он поддерживает Z-упорядочение, и производительность будет значительно выше, чем при использовании UIViews.

...