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

StackOverflow https://stackoverflow.com/questions/826068

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

theView.layer.zPosition = 1;

Как добавил Виктор Нордлинг, «большие ценности находятся на вершине. Вы можете использовать любые значения, которые вы хотите, включая отрицательные значения. & Quot; Значением по умолчанию является 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;

Не напрямую.

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

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

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

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

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

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];

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

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

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

imageView.layer.zPosition = 100;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top