Как установить iPhone UIView z index?
Я хочу переместить один вид поверх другого, как я могу узнать индекс z вида и как перейти к вершине?
8 ответов:
UIView
братья и сестры укладываются в том порядке, в котором они добавляются в их супервизор. ЭлементUIView
иерархия методы и свойства существуют для управления порядком просмотра. В UIView.h:@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;
виды братьев и сестер упорядочены задом наперед в
subviews
массив. Таким образом, самый верхний вид будет:[parentView.subviews lastObject];
и снизу будет:
[parentView.subviews objectAtIndex:0];
как сказал Колин Кревинкель,
[parentView bringSubviewToFront:view]
приблизит вид к вершине, но это только в том случае, если мнения все братья и сестры в иерархии.
можно использовать
zPosition
свойство слоя представления (этоCALayer
object) для изменения Z-индекса представления.theView.layer.zPosition = 1;
как Виктор Нордлинга добавил: "большие значения находятся на вершине. Вы можете использовать любые значения, включая отрицательные значения."Значение по умолчанию-0.
для доступа к слою необходимо импортировать фреймворк QuartzCore. Просто добавьте эту строку кода в верхней части файла реализации.
#import "QuartzCore/QuartzCore.h"
IB и Свифт
учитывая плавный макет, где желтый-это супервизор, а красный, зеленый и синий-родственные подвиды желтого,
цель состоит в том, чтобы переместить панель (скажем, зеленый) в верхней части.
В Interface Builder
в Построителе интерфейса все, что вам нужно сделать, это перетащить вид, который вы хотите показать на вершине, чтобы в нижней части списка в контуре документов.
кроме того, вы можете выбрать вид, а затем в меню выберите "редактор" > "упорядочить" > "отправить" перед.
Быстро
есть несколько различных способов сделать это программно.
Способ 1
yellowView.bringSubviewToFront(greenView)
- этот метод является программным эквивалентом ответа IB выше.
- это работает только в том случае, если подвиды являются братьями и сестрами друг друга.
массив подвидов содержится в
yellowView.subviews
. Вот,bringSubviewToFront
перемещениеgreenView
с индексом0
до2
. Это можно наблюдать с помощьюprint(yellowView.subviews.indexOf(greenView))
Способ 2
greenView.layer.zPosition = 1
- этот метод просто перемещает 3D положение слоя выше (ближе к пользователю) на оси z. Так как по умолчанию
0
для все остальные взгляды, в результате чегоgreenView
похоже на вершине. Тем не менее, он по-прежнему остается на индекс0
наyellowView.subviews
массив. Это может привести к неожиданным результатам, потому что такие вещи, как события нажатие будет по-прежнему идти на просмотр с высоким индексом. По этой причине, возможно, лучше пойти с методом 1 выше.- The
zPosition
может быть заданCGFloat.greatestFiniteMagnitude
(CGFloat(FLT_MAX)
в старых версиях Swift), чтобы убедиться, что он находится на вершине.
Если вы хотите сделать это с помощью конструктора интерфейса XCode, вы можете использовать параметры меню В разделе редактор->расположение. Там вы найдете "отправить на фронт", "отправить обратно" и т. д.
в представлении, которое вы хотите довести до вершины... (по-быстрому)
superview?.bringSubviewToFront(self)
Если вы используете cocos2d, вы можете увидеть проблему с [parentView bringSubviewToFront:view], по крайней мере, это не работает для меня. Вместо того, чтобы принести вид, который я хотел на фронт, я отправляю другие виды назад, и это сделало трюк.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
мне нравится настраивать пользовательский интерфейс в интерфейс пользовательского интерфейса, раскадровка. Я использую
tag
указать видz-Index
.в swift 3
// Connect to those views, who need to adjust their z position. @IBOutlet var viewSetZIndex: [UIView]! // In `viewDidLoad`, or `awakeFromNib` for v in viewSetZIndex { // Use `tag` to adjust `zPosition` v.layer.zPosition = CGFloat(v.tag) }