Как установить iPhone UIView z index?

Я хочу переместить один вид поверх другого, как я могу узнать индекс Z вида и как перейти к вершине?

8 ответов


UIView братья и сестры укладываются в том порядке, в котором они добавляются в их супервизор. The 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];

как Колин Krewinkel сказал:[parentView bringSubviewToFront:view] приблизит вид к вершине, но это только в том случае, если мнения все братья и сестры в иерархии.


можно использовать zPosition свойство слоя представления (это CALayer object) для изменения Z-индекса представления.

theView.layer.zPosition = 1;

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

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

#import "QuartzCore/QuartzCore.h"

[parentView bringSubviewToFront:view] ;

IB и Свифт

учитывая текущую компоновку, где желтый-это супервизор, а красный, зеленый и синий-родственные подвиды желтого,

views - red view on top

цель состоит в том, чтобы переместить подвида (скажем, зеленый) на вершину.

views - green view on top

В Интерфейсе Строителя

в Построителе интерфейса все, что вам нужно сделать, это перетащить представление, которое вы хотите показать сверху в нижней части списка в набросках.

order of views in Interface Builder

кроме того, вы можете выбрать вид, а затем в меню выберите "редактор" > "упорядочить" > "отправить" перед.

В Swift

есть несколько различных способов сделать это программно.

Способ 1

yellowView.bringSubviewToFront(greenView)
  • этот метод является программным эквивалентом ответа IB выше.
  • он работает только в том случае, если подвиды являются братьями и сестрами друг друга.
  • массив подвидов содержится в yellowView.subviews. Вот,bringSubviewToFront перемещение greenView с индексом 0 to 2. Это можно наблюдать с помощью

    print(yellowView.subviews.indexOf(greenView))
    

Способ 2

greenView.layer.zPosition = 1
  • этот метод просто перемещает 3D-положение слоя выше (ближе к пользователю) по оси z. Так как значение по умолчанию 0 для все остальные взгляды, в результате чего greenView похоже, что он сверху. Тем не менее, он по-прежнему остается на индекс 0 на yellowView.subviews массив. Однако это может привести к неожиданным результатам, поскольку такие вещи, как события tap, по-прежнему будут первыми в представлении с самым высоким индексом. По этой причине, возможно, было бы лучше пойти с методом 1 выше.
  • на zPosition может быть задан CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) в старых версиях Swift), чтобы убедиться, что он находится сверху.

Если вы хотите сделать это через построитель интерфейса XCode, вы можете использовать параметры меню В разделе Editor->Arrangement. Там вы найдете "отправить на фронт", "отправить назад" и т. д.


в представлении, которое вы хотите довести до вершины... (в Swift)

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)
}