Chcę przenieść jeden widok na drugi, jak mogę poznać indeks z widoku i jak przejść na szczyt?Jak ustawić iPhone'a UIView z index?
Odpowiedz
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.
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"
[parentView bringSubviewToFront:view] ;
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.
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)];
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,
celem jest aby przenieść podzbiór (powiedzmy zielony) do góry.
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.
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
. TutajbringSubviewToFront
przenosigreenView
z indeksu0
do2
. Można to zaobserwować wprint(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, żegreenView
wygląda jak na górze. Jednak nadal pozostaje w indeksie0
z tablicyyellowView.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
naCGFloat.greatestFiniteMagnitude
(CGFloat(FLT_MAX)
w starszych wersjach Swift), aby upewnić się, że jest na wierzchu.
w widoku chcesz wnieść na górę ... (Swift)
superview?.bringSubviewToFront(self)
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)
}
tylko jako pomocnik, duże wartości są "na wierzchu". Możesz użyć dowolnych wartości, w tym wartości ujemnych. –
To rozwiązanie jest lepsze, jeśli chcesz, aby Twój widok zawsze był na wierzchu. Po prostu ustaw zPosition na MAXFLOAT –
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 " –