Di aplikasi iPhone Facebook iOS7 yang baru, ketika pengguna menggulir ke atas, navigationBar
perlahan - lahan menyembunyikan dirinya ke titik di mana ia sepenuhnya menghilang. Kemudian ketika pengguna menggulir ke bawah navigationBar
secara bertahap menunjukkan dirinya.
Bagaimana Anda menerapkan perilaku ini sendiri? Saya menyadari solusi berikut ini tetapi menghilang segera dan tidak terikat pada kecepatan gerakan gulir pengguna sama sekali.
[navigationController setNavigationBarHidden: YES animated:YES];
Saya harap ini bukan duplikat karena saya tidak yakin bagaimana cara terbaik untuk menggambarkan perilaku "memperluas / membuat kontrak".
ios
iphone
objective-c
ios7
uinavigationbar
El Mocoso
sumber
sumber
Jawaban:
Solusi yang diberikan oleh @peerless adalah awal yang baik, tetapi itu hanya memulai animasi setiap kali menyeret dimulai, tanpa mempertimbangkan kecepatan gulir. Ini menghasilkan pengalaman choppier daripada yang Anda dapatkan di aplikasi Facebook. Untuk mencocokkan perilaku Facebook, kita perlu:
Pertama, Anda membutuhkan properti berikut:
Dan berikut adalah
UIScrollViewDelegate
metodenya:Anda juga akan memerlukan metode pembantu ini:
Untuk perilaku yang sedikit berbeda, ganti baris yang memposisikan ulang bar saat menggulir (
else
blokirscrollViewDidScroll
) dengan yang ini:Ini memposisikan bilah berdasarkan persentase gulir terakhir, bukan jumlah absolut, yang menghasilkan pudar yang lebih lambat. Perilaku aslinya lebih seperti Facebook, tapi saya juga suka yang ini.
Catatan: Solusi ini hanya untuk iOS 7+. Pastikan untuk menambahkan cek yang diperlukan jika Anda mendukung versi iOS yang lebih lama.
sumber
customView
.ScrollView
'scontentSize
lebih kecil dari frame, animasi geser tidak bekerja. Pastikan juga Anda mengatur ulang alpha semua item navigasi kembali ke 1.0 inviewDidDisappear
.EDIT: Hanya untuk iOS 8 ke atas.
Anda dapat mencoba menggunakannya
Bekerja untukku.
Jika pengodean Anda cepat, Anda harus menggunakan cara ini (dari https://stackoverflow.com/a/27662702/2283308 )
sumber
Berikut ini satu lagi implementasi: TLYShyNavBar v1.0.0 dirilis!
Saya memutuskan untuk membuat sendiri setelah mencoba solusi yang disediakan, dan bagi saya, mereka berkinerja buruk, memiliki penghalang yang tinggi untuk masuk dan kode plat boiler, atau tidak memiliki tampilan ekstensi di bawah navbar. Untuk menggunakan komponen ini, yang harus Anda lakukan adalah:
Oh, dan itu adalah pertempuran yang diuji di aplikasi kita sendiri.
sumber
extendedLayoutIncludesOpaqueBars
sudah diaturYES
pada sayaUICollectionViewController
Anda dapat melihat GTScrollNavigationBar saya . Saya telah mensubklasifikasikan UINavigationBar untuk membuatnya gulir berdasarkan gulir dari UIScrollView.
Catatan: Jika Anda memiliki bilah navigasi OPAQUE, scrollview harus BUKA ketika bilah navigasi HIDDEN. Inilah yang dilakukan oleh GTScrollNavigationBar. (Sama seperti di misalnya Safari di iOS.)
sumber
iOS8 menyertakan properti untuk menyembunyikan bilah navigasi secara gratis. Ada video WWDC yang menunjukkannya, cari "View Advancements Advancements in iOS 8".
Contoh :
}
Properti lainnya:
Ditemukan melalui http://natashatherobot.com/navigation-bar-interactions-ios8/
sumber
Saya punya semacam solusi cepat dan kotor untuk itu. Belum pernah melakukan pengujian mendalam, tetapi inilah idenya:
Properti itu akan menyimpan semua item di navbar untuk kelas UITableViewController saya
Di kelas UITableViewController yang sama yang saya miliki:
Itu hanya untuk ios> = 7, itu jelek saya tahu tetapi cara cepat untuk mencapai ini. Ada komentar / saran dipersilahkan :)
sumber
Ini berfungsi untuk iOS 8 dan di atasnya dan memastikan bahwa bilah status masih mempertahankan latar belakangnya
Dan jika Anda ingin menampilkan bilah navigasi ketika Anda mengetuk bilah status, Anda dapat melakukan ini:
sumber
Inilah implementasi saya: SherginScrollableNavigationBar .
Dalam pendekatan saya, saya menggunakan
KVO
untuk mengamatiUIScrollView
keadaan, jadi tidak perlu menggunakan delegasi (dan Anda dapat menggunakan delegasi ini untuk apa pun yang Anda butuhkan).sumber
Silakan coba solusi saya ini dan beri tahu saya mengapa ini tidak sebagus jawaban sebelumnya.
sumber
Salah satu cara yang saya lakukan ini adalah sebagai berikut.
Daftarkan pengontrol tampilan Anda untuk menjadi
UIScrollViewDelegate
milik AndaUITableView
misalnya.Dari dalam
UIScrollViewDelegate
metode Anda bisa mendapatkan contentOffset baru dan menerjemahkanUINavigationBar
naik atau turun Anda sesuai.Mengatur alpha dari subview juga dapat dilakukan berdasarkan pada beberapa nilai ambang batas dan faktor yang dapat Anda atur dan hitung.
Semoga ini bisa membantu!
sumber
Selain jawaban Iwburk, saya menambahkan yang berikut ini untuk memperbaiki masalah alfa pada bilah navigasi yang tidak kustom dan untuk mereset bilah navigasi di metode viewWillDisappear:
sumber
Saya mencari solusi yang memungkinkan gaya dan perilaku apa pun. Anda akan melihat bahwa perilaku kondensasi batang berbeda di banyak aplikasi berbeda. Dan tentu saja, tampilan bilah benar-benar berbeda antara aplikasi.
Saya membuat solusi untuk masalah ini dengan https://github.com/bryankeller/BLKFlexibleHeightBar/
Anda bisa menentukan aturan perilaku Anda sendiri untuk mengontrol bagaimana dan kapan bar menyusut dan tumbuh, dan Anda bisa menentukan dengan tepat bagaimana Anda ingin subview bar bereaksi terhadap bar yang mengkondensasi atau tumbuh.
Lihat proyek saya jika Anda ingin banyak fleksibilitas untuk membuat jenis header bar apa pun yang dapat Anda pikirkan.
sumber
Saya mencoba meniru perilaku ini dalam situasi di mana saya memerlukan tajuk yang disesuaikan yang membahas tentang UITableView. Saya memutar bilah "navigasi" saya sendiri karena ini berada di bawah banyak hal lain pada halaman dan saya ingin header bagian untuk mengikuti perilaku "docking" default. Saya pikir saya menemukan cara yang cukup pintar dan ringkas untuk menyesuaikan UITableView / UIScrollView bersama-sama dengan objek lain dalam gaya yang mirip dengan yang terlihat di Facebook / Instagram / Chrome / etc. aplikasi.
Dalam file .xib saya, komponen saya dimuat ke tampilan bentuk bebas: http://imgur.com/0z9yebJ (maaf, tidak punya rep untuk gambar inline)
Perhatikan bahwa, di bilah sisi kiri, tabel disusun di belakang tampilan tajuk utama. Anda tidak dapat membedakan dari tangkapan layar, tetapi juga memiliki posisi y yang sama dengan tampilan header utama. Karena tidak terlihat, properti contentInset pada UITableView diatur ke 76 (ketinggian tampilan header utama).
Untuk membuat tampilan tajuk utama geser bersamaan dengan UIScrollView, saya menggunakan metode scrollViewDidScroll UIScrollViewDelegate untuk melakukan beberapa perhitungan dan mengubah contentInset UIScrollView serta bingkai tampilan tajuk utama.
Pernyataan if pertama melakukan sebagian besar pengangkatan berat, tetapi saya harus menyertakan dua lainnya untuk menangani situasi di mana pengguna menyeret paksa dan nilai contentOffset awal yang dikirim ke scrollViewDidScroll berada di luar kisaran pernyataan if pertama .
Pada akhirnya, ini bekerja sangat baik untuk saya. Saya benci memuat proyek saya dengan sekelompok subclass yang membengkak. Saya tidak dapat berbicara apakah ini solusi terbaik berdasarkan kinerja (Saya selalu ragu untuk memasukkan kode apa pun di scrollViewDidScroll karena dipanggil sepanjang waktu), tetapi jejak kode adalah yang terkecil yang pernah saya lihat dalam solusi untuk masalah ini dan itu tidak melibatkan bersarang UITableView di UIScrollView (Apple menyarankan agar hal ini tidak ada dalam dokumentasi dan acara sentuh berakhir agak funky pada UITableView). Semoga ini bisa membantu seseorang!
sumber
Menyembunyikan NavigasiBar adalah proyek hebat yang menyembunyikan Bilah Navigasi dan Bilah Tab jika Anda mau.
https://github.com/tristanhimmelman/MenyembunyikanNavigationBar
sumber
Saya mencoba menerapkan GTScrollNavigationBar tetapi aplikasi saya mengharuskan saya untuk memodifikasi batasan tata letak otomatis. Saya memutuskan untuk memberikan contoh implementasi saya di GitHub kalau-kalau ada orang lain yang melakukan ini dengan tata letak otomatis. Masalah lain yang saya miliki dengan sebagian besar implementasi lainnya adalah bahwa orang tidak menetapkan batas-batas tampilan gulir untuk menghindari efek gulir paralaks yang Anda buat saat Anda menggulir dan menyesuaikan ukuran tampilan gulir secara bersamaan.
Periksa JSCollapsingNavBarViewController jika Anda perlu melakukan ini dengan tata letak otomatis. Saya telah menyertakan dua versi, satu dengan bilah nav saja dan yang lain dengan bilah-bilah di bawah bilah nav yang runtuh sebelum menciutkan bilah nav.
sumber
Saya mencobanya dengan cara ini, saya harap ini akan membantu. cukup implementasikan kode dalam metode delegasi dan atur ke tampilan / subview yang diinginkan
sumber
Perpanjangan dari jawaban @Iwburk ... Alih-alih mengubah asal bilah navigasi, saya perlu memperluas / mengecilkan ukuran bilah navigasi.
Itu belum berfungsi dengan
stoppedScrolling
metode ini, sakit posting pembaruan ketika saya memilikinyasumber
Semua pendekatan ini tampaknya terlalu rumit ... Jadi secara alami, saya membangun sendiri:
sumber
frame
properti?Saya menemukan semua jawaban yang diberikan di Objective-C. Ini jawaban saya di Swift 3. Ini adalah kode yang sangat umum dan dapat digunakan secara langsung. Ia bekerja dengan UIScrollView dan UITableView.
Logika pengaturan alpha ke item navigasi disalin dari @ WayneBurkett jawab dan ditulis ulang dalam Swift 3.
sumber