Есть ли способ установки своего рода z-index для z-позиции объектов UIImageView? - PullRequest
10 голосов
/ 05 мая 2009

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

Ответы [ 9 ]

20 голосов
/ 29 ноября 2010

вместо использования insertSubiew вы можете попробовать:

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view
14 голосов
/ 06 мая 2009

Вы сказали, что использовали UIImageView. Рисование изображения с помощью UIImageView означает его инициализацию, а затем добавление в представление контейнера.

Разве вы не можете просто использовать этот код в цикле?

[containerView insertSubview:image atIndex:[[containerView subviews] count]]

В результате, вид, добавленный первым, находится сверху стека представлений (хотя я еще не смог проверить это :))

6 голосов
/ 18 февраля 2014

https://stackoverflow.com/a/4631895/2482283

Вы можете использовать свойство zPosition слоя представления (это объект CALayer), чтобы изменить z-индекс представления.

theView.layer.zPosition = 1;

Как добавил Виктор Нордлинг, «большие значения находятся сверху. Вы можете использовать любые значения, которые вы хотите, включая отрицательные значения». Значение по умолчанию - 0.

Вам необходимо импортировать платформу QuartzCore для доступа к слою. Просто добавьте эту строку кода вверху вашего файла реализации.

#import "QuartzCore/QuartzCore.h"

другим способом (https://stackoverflow.com/a/4663526/2482283), вы также можете использовать метод uiviews:

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;
3 голосов
/ 02 апреля 2012

Если у вас есть ссылка на вид ниже / выше, вам нужно добавить дополнительный вид, вы можете использовать следующее

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];
3 голосов
/ 23 мая 2011

У меня была такая же проблема. Мне нужен был элемент subview с самым высоким и самым низким z-индексом. Из моего тестирования я узнал, что UIKit упорядочивает элементы в свойстве subviews согласно их z-позиции. Если вы берете [self.scrollview subviews] например. Первый элемент массива - это подпредставление, которое находится в самом конце. Элемент массива с самым высоким индексом является подпредставлением в самом начале. Если вы используете

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view`

массив подпредставлений будет соответствующим образом переупорядочен.

3 голосов
/ 05 мая 2009

Не напрямую.

Одним из решений было бы дать UIViews свойство z-index; целое число, определяющее уровень вашей глубины. Затем вы могли бы пройти через NSArray (myArray), содержащий UIViews, добавив их в качестве subview в порядке глубины.

2 голосов
/ 05 мая 2009

На самом деле, насколько я знаю, для этого не существует свойства позиции z-index. Рисование в виде использует простую модель рисования.

Вы можете либо поместить свою логику в цикл рисования (то есть нарисовать то, что хотите, в последнюю очередь) или использовать анимацию какао, поскольку в отличие от UIImageView, слои CALay действительно имеют глубину (они являются двухмерной проекцией трехмерного пространства) , См. здесь для справки.

1 голос
/ 14 августа 2012
imageView.layer.zPosition = 100;
1 голос
/ 23 февраля 2011

Возможно, вы захотите использовать CALayer вместо множества объектов UIImageView. Объекты UIImageView хороши, но для интенсивного рисования CALayer имеют меньший вес и более эффективны (хотя, если вам нужно, чтобы пользователь взаимодействовал с изображениями, объект просмотра лучше). Это действительно зависит от того, что вы делаете. CALayers действительно имеют свойство zPosition. Это то, что использует UIKit, когда он упорядочивает позицию UIView в стеке представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...