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

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

Ответ 1

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;

Представления sibling упорядочены по фронту в массиве subviews. Таким образом, самый верхний вид будет выглядеть следующим образом:

[parentView.subviews lastObject];

и вид снизу:

[parentView.subviews objectAtIndex:0];

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

Ответ 2

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

theView.layer.zPosition = 1;

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

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

#import "QuartzCore/QuartzCore.h"

Ответ 3

IB и Swift

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

views - red view on top

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

views - green view on top

В Интерфейсном Разработчике

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

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, описанный выше.
  • zPosition может быть установлен на CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) в более старых версиях Swift), чтобы убедиться, что он находится сверху.

Ответ 4

[parentView bringSubviewToFront:view] ;

Ответ 5

Если вы хотите сделать это через XCode Interface Builder, вы можете использовать опции меню в разделе "Редактор- > Расположение". Там вы найдете "Отправить на фронт", "Отправить обратно" и т.д.

Ответ 6

В представлении, которое вы хотите перенести в начало... (быстро)

superview?.bringSubviewToFront(self)

Ответ 7

Если вы используете cocos2d, вы можете увидеть проблему с [parentView bringSubviewToFront: view], по крайней мере, она не работает для меня. Вместо того, чтобы принести представление, которое я хотел на фронт, я отправляю другие взгляды назад, и это сделало трюк.

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

Ответ 8

Мы можем использовать zPosition в ios

если у нас есть представление с именем salonDetailView например: @IBOutlet weak var salonDetailView: UIView!

В моем случае см. изображение

и иметь UIView для GMSMapView Например: @IBOutlet weak var mapViewUI: GMSMapView!

Чтобы показать верхнюю часть ViewDetailView на карте ViewUI

используйте zPosition, как показано ниже

salonDetailView.layer.zPosition = 1

Ответ 9

Мне нравится настраивать пользовательский интерфейс в интерфейсе пользовательского интерфейса раскадровки. Я использую tag для обозначения этого вида z-Index.

В быстрой 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)
}

Ответ 10

Или используйте это

- (void)insertSubview:(UIView *)view belowSubview:(UIView*)siblingSubview;

согласно здесь