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

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

7 ответов

Решение

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 объект), чтобы изменить z-индекс вида.

theView.layer.zPosition = 1;

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

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

#import "QuartzCore/QuartzCore.h"

IB и Swift

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

взгляды - красный вид сверху

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

виды - зеленый вид сверху

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

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

порядок представлений в Интерфейсном Разработчике

В качестве альтернативы вы можете выбрать вид, а затем в меню перейти в " Редактор"> "Упорядочить"> "Отправить на фронт".

В Свифте

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

Способ 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), чтобы убедиться, что он на вершине.
[parentView bringSubviewToFront:view] ;

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

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

superview?.bringSubviewToFront(self)

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

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

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

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

Чтобы отобразить View salonDetailView в верхней части карты ViewUI

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

salonDetailView.layer.zPosition = 1

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

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

Мне нравится настраивать интерфейс в интерфейсе раскадровки. я использую 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)
}

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

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

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

Другие вопросы по тегам