Я хочу переместить один вид поверх другого, как я могу узнать индекс z для представления и как перейти на верх?
Как установить индекс iPhone UIView 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
Учитывая плавный макет, где желтый - это суперпредставление, а красный, зеленый и синий - родственные подвиды желтого,
цель состоит в том, чтобы переместить подпредставление (скажем, зеленое) наверх.
В Интерфейсном Разработчике
В Интерфейсном Разработчике все, что вам нужно сделать, это перетащить вид, который вы хотите показать, сверху вниз в список в Схеме документов.
Кроме того, вы можете выбрать вид, а затем в меню перейти в "Редактор"> "Расположить"> "Отправить на передний план".
В Свифте
Есть несколько разных способов сделать это программно.
Метод 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;
согласно здесь