Як встановити індекс iPhone UIView z?


252

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

Відповіді:


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
Muhammad Hassan Nasr

27
Я нещодавно дізнався, що zPosition шару та обробник вводу UIView мають два різних Z-порядки. Це дуже дивно, коли ваші кліки "проходять"
Stephen J

чи повинен нагляд за думками бути однаковим, щоб зробити zPositionтвори?
Hlung

3
Я помітив, що, незважаючи на те, що вид зверху, кліки проходять через нього до предметів під ним. Це слід вважати помилкою. Я намагаюся знайти загальний спосіб уникнути цієї проблеми, не маючи явного відключення взаємодії користувачів з будь-якими поглядами, які трапляються внизу.
Брюс Патін

103

ІБ та Свіфт

Враховуючи текучий макет, де жовтий - це надзвичайний огляд, а червоний, зелений та синій кольори - це подвиди жовтого кольору,

види - червоний вид зверху

мета - перемістити підзор (скажімо, зелений) до вершини.

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

У програмі Interface Builder

У Builder інтерфейсу все, що вам потрібно зробити, - це перетягнути подання, яке ви хочете відобразити вгорі до нижньої частини списку в «Документи контуру».

порядок переглядів у програмі Interface Builder

Крім того, ви можете вибрати перегляд, а потім у меню перейти до Редактора> Впорядкувати> Надіслати на фронт .

У Свіфта

Існує кілька різних способів зробити це програмно.

Спосіб 1

yellowView.bringSubviewToFront(greenView)
  • Цей метод є програмним еквівалентом відповіді на ІБ вище.

  • Він працює лише в тому випадку, якщо підзагляди є рідними братами один одного.

  • Масив підпереглядів міститься в yellowView.subviews. Тут bringSubviewToFrontпереходить greenViewз індексу 0до 2. Це можна спостерігати за допомогою

      print(yellowView.subviews.indexOf(greenView))

Спосіб 2

greenView.layer.zPosition = 1
  • Цей спосіб просто переміщує тривимірне положення шару вище (ближче до користувача) на осі z. Оскільки за замовчуванням є 0всі інші представлення, то результат greenViewвиглядає так, як виглядає на вершині. Тим НЕ менше, він по- , як і раніше залишається на рівні індексу 0в yellowView.subviewsмасиві. Це, однак, може призвести до несподіваних результатів, оскільки такі речі, як події натискання, все одно перейдуть до перегляду з найвищим числом індексу. З цієї причини, можливо, буде краще скористатися вищевказаним методом.
  • zPositionМоже бути встановлений CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)в старіших версіях Swift) , щоб переконатися , що він знаходиться на вершині.

дякую за це ... я витратив 8 годин, намагаючись зрозуміти це. yellowView.bringSubviewToFront (greenView) працював чудово.
MizAkita

Цікаво, що перегляди контейнерів цього не поважають! Ви повинні вручну перемістити їх у код, здається.
Fattie


19

Якщо ви хочете зробити це за допомогою XCode's Interface Builder, ви можете скористатися параметрами меню в редакторі-> Упорядкування. Там ви знайдете "Надіслати на фронт", "Відправити назад" тощо.


Що робити, якщо параметри Arrange відключені?
mr5

9

У межах подання ви хочете піднятись до вершини ... (швидко)

superview?.bringSubviewToFront(self)

btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss

4

Якщо ви використовуєте cocos2d, можливо, ви побачите проблему з [parentView doneSubviewToFront: view], принаймні, це не працювало для мене. Замість того, щоб повернути думку, яку я хотів на фронт, я відсилаю інші погляди назад, і це зробило трюк.

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

2

Ми можемо використовувати zPosition в ios

якщо у нас є вид з назвою salonDetailView, наприклад:@IBOutlet weak var salonDetailView: UIView!

У моєму випадку дивіться зображення

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

Щоб показати салон ViewDetailView у верхній частині mapViewUI

використовувати zPosition, як показано нижче

salonDetailView.layer.zPosition = 1

будь ласка, опублікуйте фотографії та код прямо тут у своїй відповіді, щоб полегшити отримання ОП.
skratchi.at

як початківець, StackOverflow не дозволить мені зробити це шкода. ви можете перевірити зображення проблеми i.stack.imgur.com/d9Cx3.png
abhijith k

0

Або скористайтеся цим

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

як тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.