Pada iPhone X yang baru, apa cara yang paling tepat untuk mendapatkan ketinggian atas dan bawah untuk area yang tidak aman?
ios
iphone-x
safearealayoutguide
Tulleb
sumber
sumber
keyWindow
selalunil
jadi saya mengubahnyawindows[0]
dan menghapus?
dari chaining opsional, lalu berhasil.Untuk mendapatkan ketinggian antara panduan tata letak yang baru saja Anda lakukan
Jadi
full frame height = 812.0
,safe area height = 734.0
Di bawah ini adalah contoh di mana tampilan hijau memiliki bingkai
guide.layoutFrame
sumber
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, yang memang memiliki kerangka aman.Cepat 4, 5
Untuk menyematkan tampilan ke jangkar area aman menggunakan kendala dapat dilakukan di mana saja dalam siklus hidup pengontrol tampilan karena mereka antri oleh API dan ditangani setelah tampilan dimasukkan ke dalam memori. Namun, mendapatkan nilai area aman memerlukan menunggu menjelang akhir siklus hidup pengontrol tampilan
viewDidLayoutSubviews()
.Ini dihubungkan ke pengontrol tampilan apa pun:
Saya lebih suka metode ini untuk mengeluarkannya dari jendela (bila memungkinkan) karena ini adalah cara API dirancang dan, yang lebih penting, nilai diperbarui selama semua perubahan tampilan, seperti perubahan orientasi perangkat.
Namun, beberapa pengendali tampilan khusus yang disajikan tidak dapat menggunakan metode di atas (saya curiga karena mereka berada dalam tampilan wadah sementara). Dalam kasus seperti itu, Anda bisa mendapatkan nilai dari pengontrol tampilan root, yang akan selalu tersedia di mana saja dalam siklus hidup pengontrol tampilan saat ini.
sumber
viewDidLayoutSubviews
(yang bisa disebut berkali-kali), inilah solusi yang akan berfungsi bahkan diviewDidLoad
: stackoverflow.com/a/53864017/7767664Tidak ada jawaban lain di sini yang berfungsi untuk saya, tetapi ini berhasil.
sumber
Semua jawaban di sini sangat membantu, Terima kasih kepada semua orang yang menawarkan bantuan.
Namun seperti yang saya lihat bahwa topik area aman sedikit bingung yang sepertinya tidak terdokumentasi dengan baik.
Jadi saya akan meringkasnya di sini sebagai bubur mungkin untuk membuatnya mudah dimengerti
safeAreaInsets
,safeAreaLayoutGuide
danLayoutGuide
.Di iOS 7, Apple memperkenalkan
topLayoutGuide
danbottomLayoutGuide
properti diUIViewController
, Mereka memungkinkan Anda untuk membuat batasan untuk menjaga konten Anda agar tidak disembunyikan oleh bilah UIKit seperti status, navigasi, atau bilah tab. Mungkin saja dengan panduan tata letak ini untuk menentukan batasan pada konten, menghindarinya disembunyikan oleh elemen navigasi atas atau bawah (bilah UIKit, bilah status, nav atau bilah tab ...).Jadi misalnya jika Anda ingin membuat tableView dimulai dari layar atas Anda telah melakukan sesuatu seperti itu:
Di iOS 11 Apple telah menghentikan properti ini menggantikannya dengan panduan tata letak area aman tunggal
Area aman menurut Apple
Di bawah, area aman yang disorot di iPhone 8 dan iPhone X-series:
Ini
safeAreaLayoutGuide
adalah properti dariUIView
Untuk mendapatkan ketinggian
safeAreaLayoutGuide
:Itu akan mengembalikan ketinggian Panah di gambar Anda.
Sekarang, bagaimana dengan mendapatkan tinggi "takik" dan ketinggian indikator layar beranda bawah?
Di sini kita akan menggunakan
safeAreaInsets
Berikut ini akan menunjukkan area tidak aman dan ada jarak dari tepi pada iPhone 8 dan salah satu dari iPhone X-Series.
Sekarang, jika bilah navigasi ditambahkan
Jadi, sekarang bagaimana cara mendapatkan ketinggian area yang tidak aman? kami akan menggunakan
safeAreaInset
Berikut adalah solusi namun mereka berbeda dalam hal yang penting,
Pertama:
Itu akan mengembalikan EdgeInsets, Anda sekarang dapat mengakses bagian atas dan bawah untuk mengetahui insets,
Kedua:
Yang pertama Anda mengambil insets tampilan, jadi jika ada bilah navigasi akan dipertimbangkan, namun yang kedua Anda mengakses safeAreaInsets jendela sehingga bilah navigasi tidak akan dianggap
sumber
Di iOS 11 ada metode yang memberi tahu kapan safeArea telah berubah.
sumber
Aku bekerja dengan kerangka kerja CocoaPods dan dalam hal
UIApplication.shared
ini tidak tersedia maka saya menggunakansafeAreaInsets
dalam pandangan iniwindow
:sumber
safeAreaLayoutGuide Saat tampilan terlihat di layar, panduan ini mencerminkan bagian tampilan yang tidak tercakup oleh bilah navigasi, bilah tab, bilah alat, dan tampilan leluhur lainnya. (Di tvOS, area aman mencerminkan area yang tidak tertutup bezel layar.) Jika tampilan saat ini tidak dipasang dalam hierarki tampilan, atau belum terlihat di layar, tepi panduan tata letak sama dengan tepi tampilan.
Kemudian untuk mendapatkan ketinggian panah merah di tangkapan layar itu:
sumber
Swift 5, Xcode 11.4
Ini akan memberikan peringatan penghentian. '' keyWindow 'sudah tidak digunakan lagi di iOS 13.0: Sebaiknya tidak digunakan untuk aplikasi yang mendukung banyak adegan karena mengembalikan jendela kunci di semua adegan yang terhubung' karena adegan yang terhubung. Saya menggunakan cara ini.
sumber
Objective-C Siapa yang punya masalah ketika keyWindow sama dengan nihil . Cukup masukkan kode di atas di viewDidAppear (bukan di viewDidLoad)
sumber
sumber
Ekstensi 5 Swift
Ini dapat digunakan sebagai Extension dan dipanggil dengan: UIApplication.topSafeAreaHeight
Perpanjangan aplikasi UIA adalah opsional, bisa berupa perpanjangan UIView atau apa pun yang disukai, atau mungkin bahkan lebih baik fungsi global.
sumber
Pendekatan yang lebih bulat
sumber
Bagi Anda yang beralih ke mode lansekap, Anda harus memastikan untuk menggunakan viewSafeAreaInsetsDidChange setelah rotasi untuk mendapatkan nilai terbaru:
sumber