InputAccessoryView merapat di bawah
I'm mencoba untuk mencapai posisi yang sama perilaku sebagai dasar input teks bar di Apple's aplikasi Pesan.
Saya telah mencoba banyak pendekatan, mencari tinggi dan rendah dan ada banyak pertanyaan yang serupa, tapi tidak satupun yang memuaskan.
Untuk menentukan:
- Ada
UIToolbar
di bagian bawah tampilan - Toolbar ini untuk mengikuti keyboard sebagai keyboard muncul dan menghilang
- Toolbar harus tetap di atas keyboard ketika keyboard terlihat
- Ketika keyboard tersembunyi, toolbar tetap ("merapat") di bagian bawah tampilan
Solusi yang diusulkan:
Manual menghidupkan toolbar dalam menanggapi keyboard penampilan pemberitahuan
Solusi ini tidak memenuhi kasus khusus dari kedua persyaratan (toolbar adalah untuk mengikuti keyboard sebagai keyboard muncul dan menghilang):
Di iOS 7, UIScrollViewKeyboardDismissMode
diperkenalkan. Hal ini memungkinkan interaktif gerakan untuk menolak keyboard. Sebagai pengguna panci lalu tepi atas keyboard, keyboard frame secara bertahap berikut. Solusi ini tidak apa-apa untuk mengakomodasi perilaku ini dan hanya meninggalkan toolbar terdampar di it's animasi posisi.
Selain itu, solusi ini juga gagal untuk memenuhi suatu kasus khusus dari ketiga persyaratan (toolbar harus tetap di atas keyboard ketika keyboard terlihat):
- Rotasi. Solusi ini panggilan untuk tambahan, mengganggu asing kode (seperti yang akan kita lihat di bagian berikutnya diusulkan solusi) untuk memutar toolbar dalam menanggapi rotasi perangkat.
Lain masalah dengan solusi ini:
- Ketinggian Keyboard. Dengan solusi ini, toolbar ini tidak diasumsikan untuk menjadi bagian dari ketinggian keyboard, sehingga tambahan kode yang harus ditulis untuk dukungan yang tepat insetting konten.
Selanjutnya solusi yang diusulkan:
Gunakan UIResponder
's inputAccessoryView
Solusi ini tampaknya menjadi cara Apple dimaksudkan untuk mendukung perilaku semacam ini, karena memecahkan semua kekurangan dari manual menghidupkan toolbar. Tapi solusi ini benar-benar merindukan keempat persyaratan (ketika keyboard tersembunyi, toolbar tetap ("merapat") di bagian bawah tampilan).
Tampaknya solusinya adalah dengan menggunakan UIResponder
's inputAccessoryView
, tapi entah bagaimana membuat inputAccessoryView
tidak bergerak di bawah tampilan. I'm mencari kode yang bersih untuk mencapai hal ini. Ada yang rumit, hampir semua yang mulia, upaya lain, tapi seperti yang disebutkan, mereka tidak memenuhi persyaratan.
Dalam kasus tertentu, saya ingin menggunakan UINavigationController
's toolbar yang memerlukan tambahan masalah seperti ini tidak dimaksudkan perilaku untuk UINavigationController
. Tidak peduli, aku'm. bersedia untuk memperkenalkan beberapa hacky perbaikan untuk mencapai itu.
Aku hanya menunjukkan "" solusi oleh Jason Mandor (@threeve). Pada view controller (ya, view controller) tambahkan
inputAccessoryView:
dan kembali ke tampilan yang anda inginkan untuk dock di bagian bawah dan bergerak dengan keyboard. Ini hanya bekerja. Lihat doesn't benar-benar perlu untuk melihat hirarki ini akan dimasukkan oleh view controller secara otomatis.edit: juga menerapkan canBecomeFirstResponder dan kembali YA (seperti dicatat oleh Max Seelemann). reloadInputViews dapat berguna juga.
Jonathan Badeen's tersebut solusi bekerja untuk saya. Berikut ini's kode dari Arik yang menunjukkan bagaimana untuk menerapkannya (harus pergi pada anda sesuai view controller):
Bagi mereka yang mencari untuk Swift versi:
Hubungkan toolbar (dalam kasus saya '
myToolBar
') pada view controller. Kemudian menimpacanBecomeFirstResponder
metode dan menimpa getterinputAccessoryView
variabel. Juga don't lupa untuk menambahkandiri.myToolBar.removeFromSuperview()
atau yang lain xcode akan mengeluh.Ada's yang sangat baik, mudah-untuk-melaksanakan, open-source solusi untuk hal ini dari orang-orang baik di Slack: SlackTextViewController.
Berikut ini's cara menerapkan tampilan dengan toolbar merapat dalam empat langkah:
MessageViewController
yang mewarisi dariSLKTextViewController
, tidak perlu menulis kode yang lebih dari ini:impor Yayasan impor UIKit
kelas MessageViewController: SLKTextViewController {
diperlukan init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) } }
Alat peraga untuk tim di Slack untuk penggalian tersebut berguna pod.
Jadi saya tahu ini adalah sebuah posting lama dan saya tidak yakin jika anda memutuskan ini atau tidak, tapi aku menemukan cara untuk mendapatkan kerja ini. Saya percaya ada bug di inputAccessoryView, tapi saya buat hacky solusi untuk berperilaku dengan cara aplikasi pesan tidak. Saya pikir saya memberikan semua kode yang diperlukan untuk melaksanakan pekerjaan di sekitar. Saya akan mencoba dan mendapatkan yang lebih sesuai dengan posting blog yang dibuat kadang-kadang di masa depan, dengan lebih mendalam deskripsi dengan temuan saya. Pertanyaan, biarkan aku tahu.