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

252

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

Tattat
источник

Ответы:

279

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]это приведет представление к вершине, но это только в том случае, если все представления являются братьями и сестрами в иерархии.

Натан Эрор
источник
329

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

theView.layer.zPosition = 1;

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

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

#import "QuartzCore/QuartzCore.h"
Даниэль говорит восстановить Монику
источник
7
Как помощник, большие ценности «на вершине». Вы можете использовать любые значения, которые вы хотите, в том числе отрицательные значения.
Виктор Нордлинг
12
Это решение лучше, если вы хотите, чтобы ваше мнение всегда было на высоте. Просто установите zPosition для MAXFLOAT
Мухаммед Хасан Наср
27
Я только что узнал, что zPosition слоя и обработчик ввода UIView находятся в двух разных Z-порядках. Это действительно странно, когда ваши клики "проходят"
Стивен J
должно ли супервизия представлений быть одинаковой, чтобы сделать zPositionработу?
Хлунг
3
Я заметил, что, несмотря на то, что вид сверху, клики проходят через объекты внизу. Это должно считаться ошибкой. Я пытаюсь найти общий способ избежать этой проблемы, без необходимости явно отключать взаимодействие с пользователем любых представлений, которые оказываются внизу.
Брюс Патин
103

IB и Swift

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

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

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

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

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

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

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

Также вы можете выбрать вид, а затем в меню перейти в « Редактор»> «Расположить»> «Отправить на передний план» .

В Свифте

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

Способ 1

yellowView.bringSubviewToFront(greenView)
  • Этот метод является программным эквивалентом ответа IB выше.

  • Это работает, только если подпредставления являются братьями и сестрами друг друга.

  • Массив подпредставлений содержится в yellowView.subviews. Здесь bringSubviewToFrontперемещается greenViewиз индекса 0в 2. Это можно наблюдать с

      print(yellowView.subviews.indexOf(greenView))

Способ 2

greenView.layer.zPosition = 1
  • Этот метод просто перемещает трехмерную позицию слоя выше (ближе к пользователю) по оси z. Так как по умолчанию 0для всех других представлений, результат greenViewвыглядит так, как будто он сверху. Тем не менее, он по- прежнему остается на уровне индекса 0в yellowView.subviewsмассиве. Однако это может привести к неожиданным результатам, потому что такие вещи, как события касания, все равно будут сначала идти к представлению с наибольшим индексным номером. По этой причине, может быть, лучше использовать метод 1 выше.
  • Можно zPositionбыло бы установить CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)в более старых версиях Swift), чтобы убедиться, что он находится на вершине.
Suragch
источник
спасибо за это ... я потратил 8 часов, пытаясь понять это. yellowView.bringSubviewToFront (greenView) работал отлично.
MizAkita
Интересно, что контейнерные представления не уважают это! Вы должны вручную переместить их в коде, кажется.
Толстяк
75
[parentView bringSubviewToFront:view] ;
Колин Крюинкель
источник
19

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

larspars
источник
Что если опции из Arrange отключены?
mr5
9

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

superview?.bringSubviewToFront(self)
Картер Медлин
источник
? btnDOWN.superview .bringSubview (toFront: btnDOWN)
Criss
4

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

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
Мадхав Сбсс
источник
2

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

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

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

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

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

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

salonDetailView.layer.zPosition = 1
Абхиджит К
источник
пожалуйста, разместите фотографии и код прямо здесь, в своем ответе, чтобы облегчить ОП получение.
skratchi.at
как новичок, StackOverflow не позволит мне сделать это извините. Вы можете проверить изображение проблемы i.stack.imgur.com/d9Cx3.png
abhijith k
0

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

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

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

Питер
источник