Измените z-порядок подвидов на iPhone

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

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

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

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

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


person Community    schedule 16.09.2009    source источник


Ответы (5)


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

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

person Timothy Walters    schedule 16.09.2009

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

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

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

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

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

person SNick    schedule 25.11.2010

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

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

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

person Brad Larson    schedule 16.09.2009

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

person Kendall Helmstetter Gelner    schedule 16.09.2009

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

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

person ja41    schedule 05.05.2012