2011-01-08 13 views

Odpowiedz

259

UIView rodzeństwa są ułożone w kolejności, w jakiej są dodawane do ich SuperView. Hierarchia i właściwości hierarchii UIView służą do zarządzania kolejnością wyświetlania. 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; 

rodzeństwa poglądy są sortowane tyłu do przodu w tablicy subviews. Więc najwyższy widok będą:

[parentView.subviews lastObject]; 

i widok z dołu będzie:

[parentView.subviews objectAtIndex:0]; 

jak Kolin Krewinkel powiedział [parentView bringSubviewToFront:view] przyniesie widok na góry, ale to tylko w przypadku, gdy poglądy wszyscy są rodzeństwem w hierarchii.

287

Możesz użyć właściwości zPosition warstwy widoku (jest to obiekt CALayer), aby zmienić indeks z widoku.

theView.layer.zPosition = 1; 

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

Musisz zaimportować strukturę QuartzCore, aby uzyskać dostęp do warstwy. Po prostu dodaj ten wiersz kodu u góry pliku implementacji.

#import "QuartzCore/QuartzCore.h" 
+6

tylko jako pomocnik, duże wartości są "na wierzchu". Możesz użyć dowolnych wartości, w tym wartości ujemnych. –

+11

To rozwiązanie jest lepsze, jeśli chcesz, aby Twój widok zawsze był na wierzchu. Po prostu ustaw zPosition na MAXFLOAT –

+23

Właśnie dowiedziałem się, że zPosition warstwy i obsługi wejściowej UIView są na dwóch różnych zleceniach Z. Czy to naprawdę dziwne, kiedy kliknięcia "przechodzą" przez " –

69
[parentView bringSubviewToFront:view] ; 
15

Jeśli chcesz to zrobić za pomocą XCode's Interface Builder, możesz użyć opcji menu w opcji Editor-> Arrangement. Znajdziesz tam "Wyślij do frontu", "Wyślij do tyłu", itp.

4

Jeśli używasz cocos2d, możesz zobaczyć problem z [parentView bringSubviewToFront: view], przynajmniej nie działa dla mnie . Zamiast wyświetlać widok, który chciałem z przodu, wysyłam inne widoki i to się udało.

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

IB i Swift

względu na płynący układ gdzie żółty jest superview i czerwony, zielony i niebieski są rodzeństwem subviews żółty,

views - red view on top

celem jest aby przenieść podzbiór (powiedzmy zielony) do góry.

views - green view on top

interfejs Builder

w interfejsie Builder Wszystko, co musisz zrobić, to przeciągnąć żądany widok pokazujący na górze na dole listy w Zarysie dokumenty.

order of views in Interface Builder

Alternatywnie, można wybrać widok, a następnie w menu przejść do Editor> Ułóż> Wyślij do Frontu.

w Swift

Istnieje kilka różnych sposobów, aby to zrobić programowo.

Metoda 1

yellowView.bringSubviewToFront(greenView) 
  • metoda jest programowa równoważnik odpowiedzi IB powyżej.
  • Działa tylko wtedy, gdy subviews są rodzeństwem.
  • Tablica subviews jest zawarta w yellowView.subviews. Tutaj bringSubviewToFront przenosi greenView z indeksu 0 do 2. Można to zaobserwować w

    print(yellowView.subviews.indexOf(greenView)) 
    

Metoda 2

greenView.layer.zPosition = 1 
  • Metoda tylko przesuwa położenia 3D do warstwy wyższej (bliżej użytkownika) na osi . Ponieważ domyślną wartością jest 0 dla wszystkich pozostałych widoków, wynikiem jest to, że greenView wygląda jak na górze. Jednak nadal pozostaje w indeksie 0 z tablicy yellowView.subviews. Może to jednak spowodować nieoczekiwane rezultaty, ponieważ rzeczy takie jak zdarzenia z kranu nadal będą najpierw wyświetlane w widoku o najwyższym numerze indeksu. Z tego powodu lepiej jest zastosować metodę 1 powyżej.
  • Można ustawić zPosition na CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) w starszych wersjach Swift), aby upewnić się, że jest na wierzchu.
+0

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

+0

Co ciekawe ** widoki kontenerów ** nie szanują tego! Musisz ręcznie przenieść je w kodzie, wydaje się. – Fattie

5

w widoku chcesz wnieść na górę ... (Swift)

superview?.bringSubviewToFront(self) 
0

Chciałbym dostosować UI w serii ujęć interfejsu UI. Używam tag, aby wskazać ten widok z-Index.

w Swift 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) 
}