Jak ustawić iPhone UIView z index?

Chcę przenieść jeden widok na drugi, Jak mogę poznać indeks z widoku i jak przejść na górę?

Author: Marco, 2011-01-08

8 answers

UIView rodzeństwo jest ułożone w kolejności, w jakiej jest dodawane do superwizji. Metody i właściwości hierarchii UIView służą do zarządzania kolejnością widoków. 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 z powrotem do przodu w tablicy subviews. Więc najwyższy widok będzie:

[parentView.subviews lastObject];

I 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 widoki są rodzeństwem w hierarchii.

 265
Author: Nathan Eror,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 22:42:10

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 dodał Viktor Nordling , " wielkie wartości są na szczycie. Możesz użyć dowolnych wartości, w tym wartości ujemnych."Wartością domyślną jest 0.

Aby uzyskać dostęp do warstwy, musisz zaimportować framework QuartzCore. Wystarczy dodać ten wiersz kodu na górze pliku implementacji.

#import "QuartzCore/QuartzCore.h"
 303
Author: Daniel Pendergast,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:25
[parentView bringSubviewToFront:view] ;
 71
Author: Kolin Krewinkel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 21:53:51

IB i Swift

W przeciwieństwie do poprzednich części serii, nie jest to pierwsza część serii, która została wydana w 2007 roku.]}

widoki-czerwony widok na górze

Celem jest przeniesienie subview (powiedzmy zielony) na górę.

widoki-Zielony widok na górę

In Interface Builder

W Kreatorze interfejsów wystarczy przeciągnąć widok, który ma być wyświetlany u góry na dół listy w dokumentach Zarys.

kolejność widoków w Interface Builder

Alternatywnie możesz wybrać widok, a następnie w menu przejdź do edytora > ułóż > Wyślij do przodu.

W Swift

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

Metoda 1

yellowView.bringSubviewToFront(greenView)
  • ta metoda jest programowym odpowiednikiem odpowiedzi IB powyżej.
  • to działa tylko wtedy, gdy podviews są rodzeństwem siebie.
  • Tablica podglądy zawarte są w yellowView.subviews. Tutaj bringSubviewToFront przenosi greenView z indeksu 0 na 2. Można to zaobserwować przy

    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ślną wartością jest 0 dla wszystkich innych widoków, w rezultacie greenView wygląda tak, jakby był na wierzchu. Jednak nadal pozostaje w indeksie 0 tablicy yellowView.subviews. Może to spowodować nieoczekiwane wyniki, jednak, ponieważ rzeczy takie jak tap zdarzenia nadal będzie iść pierwszy do widoku z najwyższym numerem indeksu. Z tego powodu lepiej byłoby zastosować metodę 1 powyżej.
  • zPosition można ustawić na CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) w starszych wersjach Swift), aby upewnić się, że jest on na górze.
 69
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 15:14:36

Jeśli chcesz to zrobić za pomocą Kreatora interfejsu XCode, możesz użyć opcji menu pod edytor- > układ. Znajdziesz tam "Wyślij do przodu"," Wyślij do tyłu " itp.

 17
Author: larspars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-16 12:48:47

W widoku, który chcesz wnieść na górę... (w języku swift)

superview?.bringSubviewToFront(self)
 7
Author: Carter Medlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 16:31:00

Jeśli używasz cocos2d, możesz zobaczyć problem z [parentView bringSubviewToFront: view], przynajmniej nie działał dla mnie. Zamiast sprowadzać widok, który chciałem z przodu, odsyłam inne widoki z powrotem i to załatwiło sprawę.

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
 4
Author: Madhav Sbss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 08:59:58

Lubię dostosowywać interfejs UI w interfejsie storyboard UI. Używam tag do wskazania tych widoków 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)
}
 0
Author: AechoLiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-02 05:51:57