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


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

8 223

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"
[parentView bringSubviewToFront:view] ;

IB и Свифт

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

views - red view on top

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

views - green view on top

В Interface Builder

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

order of views in 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)
}