İPhone UIView z endeksi nasıl ayarlanır?


252

Bir görünümü diğerinin üzerine taşımak istiyorum, görünümün z dizinini nasıl bilebilirim ve üste nasıl geçebilirim?

Yanıtlar:


279

UIViewkardeşler gözetimine eklendikleri sıraya göre dizilirler. UIViewHiyerarşi yöntemleri ve özellikleri görünüm sırasını yönetmek için vardır. UIView.h dilinde:

@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;

Kardeş görünümleri subviewsdizide öne doğru sıralanır . Yani en üstteki görüş:

[parentView.subviews lastObject];

ve alttan görünüm:

[parentView.subviews objectAtIndex:0];

Kolin Krewinkel'in dediği gibi, [parentView bringSubviewToFront:view]görünümü zirveye taşıyacak, ancak bu sadece görüşlerin hiyerarşideki tüm kardeşleri olması durumunda geçerlidir.


329

Sen kullanabilirsiniz zPositiongörünümün tabakasının (bir var malı CALayerbakış z-index değiştirmek için nesne).

theView.layer.zPosition = 1;

As Viktor Nordling eklendi, "büyük değerler üzerinde bulunmaktadır. Negatif değerler de dahil olmak üzere istediğiniz tüm değerleri kullanabilirsiniz." Varsayılan değer 0'dır.

Katmana erişmek için QuartzCore çerçevesini içe aktarmanız gerekir. Bu kod satırını uygulama dosyanızın üstüne eklemeniz yeterlidir.

#import "QuartzCore/QuartzCore.h"

7
Tıpkı bir yardımcı olarak, büyük değerler "en üstte" dir. Negatif değerler de dahil olmak üzere istediğiniz değerleri kullanabilirsiniz.
Viktor Nordling

12
Bu çözüm, görünümünüzün her zaman en üstte olmasını istiyorsanız daha iyidir. ZPosition'ı MAXFLOAT olarak ayarlayın
Muhammad Hassan Nasr

27
Katmanın zPosition ve UIView'in giriş işleyicisinin iki farklı Z siparişinde olduğunu öğrendim. Tıklamalarınız "geçtiğinde" gerçekten tuhaf
Stephen J

iş yapabilmek için görüşlerin denetimi aynı mı olmalı zPosition?
Hlung

3
Görünüm üstte olmasına rağmen, tıklamalar altındaki nesnelere geçiyor. Bu bir hata olarak görülmelidir. Açıkça altında olan herhangi bir görünüm kullanıcı etkileşimlerini devre dışı bırakmak zorunda kalmadan, bu sorunu önlemek için genel bir yol bulmaya çalışıyorum.
Bruce Patin

103

IB ve Swift

Sarının denetimin olduğu ve kırmızı, yeşil ve mavinin sarı alt kardeşleri olduğu akan düzen göz önünde bulundurulduğunda

görünümler - üstte kırmızı görünüm

amaç bir alt görünümü (diyelim yeşil) tepeye taşımaktır.

sayısı - üstte yeşil görünüm

Arayüz Oluşturucu'da

Arayüz Oluşturucu'da tek yapmanız gereken Dokümanlar Anahattı'nda listenin en altına göstermek istediğiniz görünümü sürüklemektir.

Builder'daki görünüm sırası

Alternatif olarak, görünümü seçebilir ve ardından menüde Düzenleyici> Yerleştir> Öne Gönder'e gidebilirsiniz .

Swift'te

Bunu programlı olarak yapmanın birkaç farklı yolu vardır.

Yöntem 1

yellowView.bringSubviewToFront(greenView)
  • Bu yöntem yukarıdaki IB cevabının programlı eşdeğeridir.

  • Sadece alt görüşlerin birbirinin kardeşi olması durumunda çalışır.

  • İçinde bir dizi alt görünüm bulunur yellowView.subviews. Burada, bringSubviewToFronthareket greenViewdizinden 0için 2. Bu ile görülebilir

      print(yellowView.subviews.indexOf(greenView))

Yöntem 2

greenView.layer.zPosition = 1
  • Bu yöntem, katmanın 3B konumunu z ekseninde daha yüksek (kullanıcıya daha yakın) taşır. Varsayılan değer 0diğer tüm görünümler için olduğundan, sonuç greenViewüstte olduğu gibidir. Ancak, yine 0de yellowView.subviewsdizinin dizininde kalır . Yine de bu, bazı beklenmedik sonuçlara neden olabilir, çünkü dokunma etkinlikleri gibi şeyler yine de en yüksek dizin numarasına sahip görünüme gider. Bu nedenle, yukarıdaki Yöntem 1'e gitmek daha iyi olabilir.
  • zPositionOlarak ayarlanmış olabilir CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)üstte olduğundan emin olmak için Swift eski sürümlerinde).

bunun için teşekkürler ... ben bunu anlamaya çalışırken 8 saat geçirdim. yellowView.bringSubviewToFront (greenView) mükemmel çalıştı.
MizAkita

İlginçtir, konteyner görünümleri buna saygı duymaz! Bunları manuel olarak kodda taşımalısınız, öyle görünüyor.
Fattie


19

Bunu XCode'un Interface Builder'ı ile yapmak istiyorsanız, Editör-> Düzenleme altındaki menü seçeneklerini kullanabilirsiniz. Orada "Öne Gönder", "Arkaya Gönder" vb.


Yerleştir seçeneğinden seçenekler devre dışı bırakılırsa ne olur?
mr5

9

Görünüm içinde en üste getirmek istediğiniz ... (hızlı bir şekilde)

superview?.bringSubviewToFront(self)

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

4

Cocos2d kullanıyorsanız, [parentView bringSubviewToFront: view] ile ilgili bir sorun görebilirsiniz, en azından benim için çalışmıyor. İstediğim görüntüyü öne getirmek yerine, diğer görüşleri geri gönderiyorum ve bu hile yaptı.

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

2

İos'ta zPosition'ı kullanabiliriz

salonDetailView adlı bir görünümümüz varsa, örneğin:@IBOutlet weak var salonDetailView: UIView!

Benim durumumda görüntüye bakın

ve GMSMapView için UIView'e sahip olun :@IBOutlet weak var mapViewUI: GMSMapView!

Görünüm göstermek için salonDetailView üst mapViewUI

zPosition'ı aşağıdaki gibi kullanın

salonDetailView.layer.zPosition = 1

OP'nin almasını kolaylaştırmak için lütfen doğrudan yanıtınıza fotoğraf ve kod gönderin.
skratchi.at

acemi olarak StackOverflow bunu özür dilerim. Sorunlu resmi kontrol edebilirsiniz i.stack.imgur.com/d9Cx3.png
abhijith k

0

Veya bunu kullanın

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

gereğince burada

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.