Как настроить индекс 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), чтобы убедиться, что он на вершине.
Если вы хотите сделать это через Интерфейсный Разработчик 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;
согласно здесь