Як встановити індекс 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.