Как настроить индекс iPhone UIView z? - PullRequest
236 голосов
/ 08 января 2011

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

Ответы [ 8 ]

317 голосов
/ 08 января 2011

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

theView.layer.zPosition = 1;

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

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

#import "QuartzCore/QuartzCore.h"
273 голосов
/ 12 января 2011

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

86 голосов
/ 12 января 2016

IB и Swift

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

views - red view on top

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

views - green view on top

В интерфейсеBuilder

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

order of views in Interface Builder

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

В 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), чтобы убедиться, что он находится сверху.
72 голосов
/ 08 января 2011
[parentView bringSubviewToFront:view] ;
19 голосов
/ 16 февраля 2012

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

9 голосов
/ 15 июля 2016

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

superview?.bringSubviewToFront(self)
4 голосов
/ 18 декабря 2013

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

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
1 голос
/ 22 марта 2019

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

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

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

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

Отображение вида salonDetailView верхняя часть mapViewUI

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

salonDetailView.layer.zPosition = 1
...