Есть ли способ установки своего рода z-index для z-позиции объектов UIImageView?
-
05-07-2019 - |
Вопрос
Я строю сетку изображений и начинаю сверху, создавая объекты 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;