Jak ustawić indeks iPhone UIView z?


252

Chcę przenieść jeden widok na drugi, w jaki sposób mogę poznać indeks Z widoku i jak przejść na górę?

Odpowiedzi:


279

UIViewrodzeństwo jest ułożone w stosy w kolejności, w jakiej są dodawane do swojego podglądu. Te UIViewmetody i właściwości hierarchii istnieją zarządzać widok zamówienie. W 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;

Widoki rodzeństwa są uporządkowane w subviewstablicy od początku do końca . Najwyższy widok to:

[parentView.subviews lastObject];

a widok z dołu będzie:

[parentView.subviews objectAtIndex:0];

Jak powiedział Kolin Krewinkel, [parentView bringSubviewToFront:view]przeniesie widok na górę, ale dzieje się tak tylko wtedy, gdy wszystkie widoki są rodzeństwem w hierarchii.


329

Możesz użyć zPositionwłaściwości warstwy widoku (jest to CALayerobiekt), aby zmienić indeks Z widoku.

theView.layer.zPosition = 1;

Jak dodał Viktor Nordling , „duże wartości są na górze. Możesz użyć dowolnych wartości, w tym ujemnych”. Wartość domyślna to 0.

Aby uzyskać dostęp do warstwy, musisz zaimportować platformę QuartzCore. Po prostu dodaj ten wiersz kodu u góry pliku implementacji.

#import "QuartzCore/QuartzCore.h"

7
Podobnie jak pomocnik, duże wartości są „na górze”. Możesz użyć dowolnych wartości, w tym ujemnych.
Viktor Nordling,

12
To rozwiązanie jest lepsze, jeśli chcesz, aby Twój widok był zawsze na górze. Po prostu ustaw zPosition na MAXFLOAT
Muhammad Hassan Nasr

27
Właśnie dowiedziałem się, że zPosition warstwy i moduł obsługi danych UIView są na dwóch różnych zamówieniach Z. To naprawdę dziwne, kiedy twoje kliknięcia „przechodzą”
Stephen J

czy nadzór widoków musi być taki sam, aby można było tworzyć zPositionprace?
Hlung

3
Zauważyłem, że mimo tego, że widok jest na górze, kliknięcia przechodzą przez niego do obiektów pod spodem. Należy to uznać za błąd. Próbuję znaleźć ogólny sposób na uniknięcie tego problemu, bez konieczności jawnego wyłączania interakcji użytkownika z dowolnymi widokami, które znajdują się poniżej.
Bruce Patin,

103

IB i Swift

Biorąc pod uwagę płynny układ, w którym żółty jest podglądem, a czerwony, zielony i niebieski są podglądami żółtego rodzeństwa,

widoki - czerwony widok na górze

celem jest przeniesienie widoku podrzędnego (powiedzmy zielonego) na górę.

widoki - zielony widok na górze

W Konstruktorze interfejsów

W Konstruktorze interfejsów wszystko, co musisz zrobić, to przeciągnąć widok, który chcesz pokazać na górze na dół listy w konspekcie dokumentów.

kolejność widoków w Konstruktorze interfejsów

Możesz też wybrać widok, a następnie w menu przejść do Edytora> Ułóż> Wyślij na przód .

W Swift

Istnieje kilka różnych sposobów na zrobienie tego programowo.

Metoda 1

yellowView.bringSubviewToFront(greenView)
  • Ta metoda jest programowym odpowiednikiem powyższej odpowiedzi IB.

  • Działa to tylko wtedy, gdy wywiady są rodzeństwem.

  • Tablica widoków podrzędnych znajduje się w yellowView.subviews. Tutaj bringSubviewToFrontprzenosi greenViewindeks 0z 2. Można to zaobserwować za pomocą

      print(yellowView.subviews.indexOf(greenView))

Metoda 2

greenView.layer.zPosition = 1
  • Ta metoda po prostu przesuwa pozycję 3D warstwy wyżej (bliżej użytkownika) na osi Z. Ponieważ domyślny jest 0dla wszystkich innych widoków, w rezultacie greenViewwygląda tak, jakby był na górze. Jednak nadal pozostaje w indeksie 0w yellowView.subviewstablicy. Może to jednak powodować nieoczekiwane wyniki, ponieważ takie rzeczy, jak zdarzenia dotknięcia, nadal będą najpierw wyświetlane w widoku o najwyższym numerze indeksu. Z tego powodu może być lepiej zastosować Metodę 1 powyżej.
  • zPositionMógł być ustawiony CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)w starszych wersjach Swift), aby upewnić się, że jest na szczycie.

dzięki za to ... spędziłem 8 godzin próbując to rozgryźć. yellowView.bringSubviewToFront (greenView) działał idealnie.
MizAkita

Co ciekawe, widoki kontenerów nie uwzględniają tego! Wygląda na to, że musisz ręcznie przenieść je w kodzie.
Fattie,


19

Jeśli chcesz to zrobić za pomocą Konstruktora interfejsów XCode, możesz użyć opcji menu w Edytorze-> Aranżacja. Znajdziesz tam „Send to Front”, „Send to Back” itp.


Co się stanie, jeśli opcje aranżacji są wyłączone?
mr5

9

W widoku, który chcesz przenieść na szczyt ... (szybko)

superview?.bringSubviewToFront(self)

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

4

Jeśli używasz cocos2d, możesz zobaczyć problem z [ParentView bringSubviewToFront: widok], przynajmniej nie działało to dla mnie. Zamiast przynieść widok, który chciałem na pierwszy plan, odsyłam pozostałe widoki i to załatwiło sprawę.

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

2

Możemy używać zPosition na iOS

jeśli mamy widok o nazwie salonDetailView np .:@IBOutlet weak var salonDetailView: UIView!

W moim przypadku zobacz obraz

i mieć UIView dla GMSMapView np .:@IBOutlet weak var mapViewUI: GMSMapView!

Aby wyświetlić widok View salonDetailView na górze mapViewUI

użyj zPosition jak poniżej

salonDetailView.layer.zPosition = 1

proszę zamieścić zdjęcia i kod bezpośrednio tutaj w odpowiedzi, aby OP mógł je zdobyć.
skratchi.at

jako początkujący StackOverflow nie pozwoli mi tego przepraszać. możesz sprawdzić obraz problemu i.stack.imgur.com/d9Cx3.png
abhijith k

0

Lub użyj tego

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

jak tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.