Bagaimana cara mengatur indeks iPhone UIView z?

252

Saya ingin memindahkan satu tampilan di atas yang lain, bagaimana saya bisa mengetahui indeks z dari tampilan, dan bagaimana untuk pindah ke atas?

Tattat
sumber

Jawaban:

279

UIViewsaudara kandung ditumpuk sesuai urutan di mana mereka ditambahkan ke superview mereka. The UIViewmetode hirarki dan properti yang ada untuk mengelola tampilan order. Dalam 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;

Tampilan saudara diperintahkan kembali ke depan dalam subviewsarray. Jadi tampilan teratas adalah:

[parentView.subviews lastObject];

dan tampilan bawah adalah:

[parentView.subviews objectAtIndex:0];

Seperti kata Kolin Krewinkel, [parentView bringSubviewToFront:view]akan membawa pandangan ke atas, tetapi ini hanya terjadi jika pandangan semua saudara dalam hierarki.

Nathan Eror
sumber
329

Anda dapat menggunakan zPositionproperti dari layer view (ini adalah CALayerobjek) untuk mengubah indeks-z view.

theView.layer.zPosition = 1;

Seperti yang ditambahkan Viktor Nordling , "nilai besar ada di atas. Anda dapat menggunakan nilai apa pun yang Anda inginkan, termasuk nilai negatif." Nilai standarnya adalah 0.

Anda perlu mengimpor kerangka kerja QuartzCore untuk mengakses lapisan. Tambahkan saja baris kode ini di bagian atas file implementasi Anda.

#import "QuartzCore/QuartzCore.h"
Daniel berkata Reinstate Monica
sumber
7
Sama seperti penolong, nilai-nilai besar "di atas". Anda dapat menggunakan nilai apa pun yang Anda inginkan, termasuk nilai negatif.
Viktor Nordling
12
Solusi ini lebih baik jika Anda ingin pandangan Anda selalu di atas. Atur saja zPosition ke MAXFLOAT
Muhammad Hassan Nasr
27
Saya baru saja belajar bahwa zPosisi layer, dan handler input UIView, menggunakan dua Z-order yang berbeda. Ini benar-benar aneh ketika klik Anda "dilewati"
Stephen J
apakah superview pandangan harus sama untuk membuat zPositionkarya?
Hlung
3
Saya perhatikan bahwa, meskipun tampilan di atas, klik melewatinya ke objek di bawahnya. Ini seharusnya dianggap sebagai bug. Saya mencoba menemukan cara umum untuk menghindari masalah itu, tanpa harus secara eksplisit menonaktifkan interaksi pengguna dari setiap pandangan yang kebetulan ada di bawahnya.
Bruce Patin
103

IB dan Swift

Mengingat tata letak yang mengalir di mana kuning adalah superview dan merah, hijau, dan biru adalah saudara subview dari kuning,

tampilan - tampilan merah di atas

tujuannya adalah untuk memindahkan subview (katakanlah hijau) ke atas.

tampilan - tampilan hijau di atas

Di Interface Builder

Di Interface Builder yang perlu Anda lakukan adalah menyeret tampilan yang ingin Anda perlihatkan di bagian atas ke bawah daftar dalam Garis Besar Dokumen.

urutan tampilan di Interface Builder

Atau, Anda dapat memilih tampilan dan kemudian di menu buka Editor> Arrange> Send to Front .

Dalam Swift

Ada beberapa cara berbeda untuk melakukan ini secara terprogram.

Metode 1

yellowView.bringSubviewToFront(greenView)
  • Metode ini adalah program setara dengan jawaban IB di atas.

  • Ini hanya berfungsi jika subview adalah saudara satu sama lain.

  • Array subview terdapat di yellowView.subviews. Di sini, bringSubviewToFrontpindahkan greenViewindeks dari 0ke 2. Ini bisa diamati dengan

      print(yellowView.subviews.indexOf(greenView))

Metode 2

greenView.layer.zPosition = 1
  • Metode ini hanya memindahkan posisi 3D lapisan lebih tinggi (lebih dekat ke pengguna) pada sumbu z. Karena defaultnya adalah 0untuk semua tampilan lain, hasilnya adalah greenViewtampilannya di atas. Namun, masih tetap pada indeks 0dari yellowView.subviewsarray yang. Namun, ini dapat menyebabkan beberapa hasil yang tidak terduga, karena hal-hal seperti acara tap masih akan lebih dulu dilihat oleh nomor indeks tertinggi. Karena itu, mungkin lebih baik menggunakan Metode 1 di atas.
  • Itu zPositiondapat diatur ke CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)dalam versi Swift yang lebih lama) untuk memastikannya ada di atas.
Suragch
sumber
terima kasih untuk ini ... saya menghabiskan 8 jam mencoba mencari tahu ini. yellowView.bringSubviewToFront (greenView) bekerja dengan sempurna.
MizAkita
Menariknya, tampilan kontainer tidak menghargai ini! Anda harus memindahkannya secara manual dalam kode, tampaknya.
Fattie
75
[parentView bringSubviewToFront:view] ;
Kolin Krewinkel
sumber
19

Jika Anda ingin melakukan ini melalui Interface Builder XCode, Anda dapat menggunakan opsi menu di bawah Pengaturan Editor->. Di sana Anda akan menemukan "Kirim ke Depan", "Kirim ke Kembali", dll.

larspars
sumber
Bagaimana jika opsi dari Arrange dinonaktifkan?
mr5
9

Dalam tampilan yang ingin Anda bawa ke atas ... (cepat)

superview?.bringSubviewToFront(self)
Carter Medlin
sumber
btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss
4

Jika Anda menggunakan cocos2d, Anda mungkin melihat masalah dengan [parentView bringSubviewToFront: view], setidaknya itu tidak berfungsi untuk saya. Alih-alih membawa tampilan yang saya inginkan ke depan, saya mengirim pandangan lain kembali dan itu berhasil.

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
Madhav Sbss
sumber
2

Kita dapat menggunakan zPosition di ios

jika kita memiliki tampilan bernama salonDetailView misalnya:@IBOutlet weak var salonDetailView: UIView!

Dalam kasus saya, lihat gambar

dan minta UIView untuk GMSMapView misalnya:@IBOutlet weak var mapViewUI: GMSMapView!

Untuk menampilkan Lihat salonDetailView di atas mapViewUI

gunakan zPosisi seperti di bawah ini

salonDetailView.layer.zPosition = 1
abhijith k
sumber
silakan posting foto dan kode langsung di sini di jawaban Anda, untuk membuatnya lebih mudah bagi OP untuk mendapatkannya.
skratchi.at
sebagai pemula, StackOverflow tidak akan mengizinkan saya melakukan itu maaf. Anda dapat memeriksa gambar masalah i.stack.imgur.com/d9Cx3.png
abhijith k
0

Atau gunakan ini

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

sesuai di sini

Peter
sumber