Saya telah membaca banyak tentang transisi iOS7 UI.
Saya tidak bisa mendapatkan apa yang tiga sifat ini automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Misalnya saya mencoba membuat pengontrol tampilan saya mulai di bawah bilah status tetapi saya tidak dapat mencapainya.
ios
objective-c
xcode
uiviewcontroller
ios7
pengguna1010819
sumber
sumber
Jawaban:
Mulai di iOS7, pengontrol tampilan menggunakan tata letak layar penuh secara default. Pada saat yang sama, Anda memiliki kontrol lebih besar tentang bagaimana menjabarkan pandangannya, dan itu dilakukan dengan properti-properti itu:
edgeForExtendedLayout
Pada dasarnya, dengan properti ini Anda mengatur sisi mana dari tampilan Anda dapat diperluas untuk mencakup seluruh layar. Bayangkan bahwa Anda mendorong
UIViewController
aUINavigationController
. Ketika tampilan pengontrol tampilan diletakkan, itu akan mulai di mana bilah navigasi berakhir, tetapi properti ini akan mengatur sisi tampilan mana (atas, kiri, bawah, kanan) dapat diperluas untuk mengisi seluruh layar.Mari kita lihat dengan sebuah contoh:
Di sini Anda tidak mengatur nilai
edgesForExtendedLayout
, karena itu nilai default diambil (UIRectEdgeAll
), sehingga tampilan memperluas tata letaknya untuk mengisi seluruh layar.Ini hasilnya:
Seperti yang Anda lihat, latar belakang merah memanjang di belakang bilah navigasi dan bilah status.
Sekarang, Anda akan mengatur nilai itu
UIRectEdgeNone
, jadi Anda memberi tahu pengontrol tampilan untuk tidak memperluas tampilan untuk menutupi layar:Dan hasilnya:
secara otomatisAdjustsScrollViewInsets
Properti ini digunakan saat tampilan Anda
UIScrollView
mirip atau mirip, seperti aUITableView
. Anda ingin meja Anda mulai di mana bilah navigasi berakhir, karena Anda tidak akan melihat seluruh konten jika tidak, tetapi pada saat yang sama Anda ingin meja Anda untuk menutupi seluruh layar saat menggulir. Dalam hal ini, pengaturanedgesForExtendedLayout
ke Tidak ada tidak akan berhasil karena meja Anda akan mulai menggulir di mana bilah navigasi berakhir dan itu tidak akan pergi di belakangnya.Di sinilah properti ini sangat berguna, jika Anda membiarkan pengontrol tampilan secara otomatis menyesuaikan inset (mengatur properti ini ke YA, juga nilai default) itu akan menambahkan insets ke bagian atas tabel, sehingga tabel akan mulai di mana navigasi bilah berakhir, tetapi gulir akan menutupi seluruh layar.
Saat ini diatur ke TIDAK:
Dan YA (secara default):
Dalam kedua kasus, tabel bergulir di belakang bilah navigasi, tetapi dalam kasus kedua (YA), itu akan mulai dari bawah bilah navigasi.
extendedLayoutIncludeOpaqueBars
Nilai ini hanyalah tambahan dari yang sebelumnya. Secara default, parameter ini diatur ke NO. Jika status bar buram, pandangan tidak akan diperluas untuk mencakup status bar, bahkan jika Anda memperpanjang tampilan Anda untuk menutupi itu (
edgesForExtendedLayout
untukUIRectEdgeAll
).Jika Anda menetapkan nilai ke YA, ini akan memungkinkan tampilan untuk pergi di bawah bilah status lagi.
Jika ada sesuatu yang tidak jelas, tulis komentar dan saya akan menjawabnya.
Bagaimana iOS mengetahui UIScrollView apa yang akan digunakan?
iOS meraih subview pertama dalam tampilan ViewController Anda, yang ada di indeks 0, dan jika itu adalah subkelas
UIScrollView
maka berlaku properti yang dijelaskan untuk itu.Tentu saja, ini berarti itu
UITableViewController
berfungsi secara default (karenaUITableView
ini adalah tampilan pertama).sumber
Tidak yakin apakah Anda menggunakan storyboard, tetapi jika ya, untuk membuat pengontrol tampilan Anda mulai di bawah bilah status (dan di atas bilah bawah):
Pilih pengontrol tampilan di IB, Pada inspektur atribut, batalkan pilihan 'Extend Edges - Under Top Bars' dan 'Extend Edges - Under Bottom Bars'.
sumber
Saya menggunakan storyboard dan menggunakan saran di atas berhasil tetapi saya tidak yakin bagaimana cara mengimplementasikannya. Di bawah ini adalah contoh singkat tentang cara mengatasi masalah dengan menempatkan solusi yang disarankan ke dalam ViewController.
Masalah Saya: Penyesuaian Otomatis disetel ke true secara default menyebabkan perbedaan antara desain storyboard dan simulator
Diselesaikan: Kode di atas diterapkan, mematikan penyesuaian otomatis.
sumber
Saya memecahkan masalah ini dengan menambahkan baris ini, tetapi masalah saya terkait dengan
UIView
, bukanUIScrollView
sumber
Hanya perlu diingat bahwa
automaticallyAdjustsScrollViewInsets
properti hanya berfungsi jika beberapa jenis tampilan gulir (tampilan tabel, tampilan koleksi, ...) adalah salah satunyaLainnya menyarankan, bahwa itu berfungsi bahkan jika itu adalah subview pertama, tetapi ada tampilan gulir lain dalam hierarki tampilan.
EDIT (ekstensi DIY)
Jika Anda menginginkan perilaku serupa walaupun Anda tidak dapat memenuhi persyaratan ini (misalnya Anda memiliki gambar latar belakang di bawah tampilan gulir), Anda dapat menyesuaikan insets tampilan gulir secara manual. Tapi tolong jangan mengaturnya menjadi konstan seperti 44 atau 64 atau bahkan 20 seperti yang banyak disarankan di sekitar SO. Anda tidak bisa mengetahui ukurannya. Mungkin ada pemberitahuan incall / gps / audio, bilah navigasi tidak harus selalu 44 poin dll.
Saya pikir solusi terbaik adalah dengan menggunakan layoutGuide
length
di didLayoutSubviews:Anda dapat menggunakan bottomLayoutGuide dengan cara yang sama.
sumber