Setelah banyak coba-coba, saya menyerah dan mengajukan pertanyaan. Saya telah melihat banyak orang dengan masalah yang sama tetapi tidak bisa mendapatkan semua jawaban untuk bekerja dengan benar.
Saya punya UITableView
yang terdiri dari sel-sel khusus. Sel-sel terbuat dari 5 bidang teks yang bersebelahan (semacam kisi).
Ketika saya mencoba untuk menggulir dan mengedit sel di bagian bawah UITableView
, saya tidak dapat mengatur agar sel saya diposisikan dengan benar di atas keyboard.
Saya telah melihat banyak jawaban berbicara tentang mengubah ukuran tampilan, dll ... tetapi tidak satupun dari mereka yang bekerja dengan baik sejauh ini.
Adakah yang bisa menjelaskan cara "benar" untuk melakukan ini dengan contoh kode konkret?
Jawaban:
Jika Anda menggunakan UITableViewController alih-alih UIViewController, itu akan secara otomatis melakukannya.
sumber
Fungsi yang melakukan pengguliran bisa lebih sederhana:
Itu dia. Tidak ada perhitungan sama sekali.
sumber
contentInset
, yang tampaknya tidak diperhitungkan saat memintavisibleRows
atauindexPathsForVisibleRows
.Saya melakukan sesuatu yang sangat mirip dengan generik, tidak perlu menghitung sesuatu yang spesifik untuk kode Anda. Periksa saja komentar pada kode:
Di MyUIViewController.h
Di MyUIViewController.m
Versi Swift 1.2+:
sumber
[tableView scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionMiddle animated: YES];
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; CGFloat tabBarHeight = appDelegate.tabBarController.tabBar.frame.size.height;
Kemudian kurangi tabBarHeight dari ketinggian keyboard di mana pun Anda menggunakan ketinggian keyboard.Solusi paling sederhana untuk Swift 3 , berdasarkan pada solusi Bartłomiej Semańczyk :
sumber
Notification
alih-alihNSNotification
akan lebih "Swift 3-y" :-)Saya memiliki masalah yang sama tetapi memperhatikan bahwa itu hanya muncul dalam satu tampilan. Jadi saya mulai mencari perbedaan dalam pengontrol.
Saya menemukan bahwa perilaku bergulir diatur dalam
- (void)viewWillAppear:(BOOL)animated
instance super.Jadi pastikan untuk menerapkan seperti ini:
Dan tidak masalah jika Anda menggunakan
UIViewController
atauUITableViewController
; memeriksanya dengan menempatkanUITableView
sebagai subview dari self.view diUIViewController
. Itu perilaku yang sama. Tampilan tidak memungkinkan untuk menggulir jika panggilan[super viewWillAppear:animated];
tidak ada.sumber
Saya mungkin telah melewatkan ini, karena saya tidak membaca seluruh posting di sini, tetapi apa yang saya buat tampak sederhana. saya belum memasukkan ini melalui pemeras, pengujian dalam semua situasi, tetapi sepertinya itu akan berfungsi dengan baik.
cukup sesuaikan kontenInset tampilan tabel dengan ketinggian keyboard, dan kemudian gulir sel ke bawah:
dan tentu saja
Apakah ini terlalu sederhana? apakah saya melewatkan sesuatu? sejauh ini bekerja untuk saya baik-baik saja, tetapi seperti yang saya katakan, saya belum memasukkannya ke alat pemeras ...
sumber
[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]
contentInset
dan secara tajam mengubah batas gulir.Saya pikir saya telah menemukan solusi untuk mencocokkan perilaku aplikasi Apple.
Pertama, di viewWillAppear Anda: berlangganan notifikasi keyboard, sehingga Anda tahu kapan keyboard akan ditampilkan dan disembunyikan, dan sistem akan memberi tahu Anda ukuran keyboard, tetapi jangan lupa untuk membatalkan registrasi di viewWillDisappear :.
Terapkan metode yang mirip dengan di bawah ini sehingga Anda menyesuaikan ukuran tableView Anda agar sesuai dengan area yang terlihat setelah keyboard ditampilkan. Di sini saya melacak keadaan keyboard secara terpisah sehingga saya dapat memilih kapan untuk mengatur sendiri tableView kembali ke ketinggian penuh, karena Anda mendapatkan notifikasi ini pada setiap perubahan bidang. Jangan lupa untuk mengimplementasikan keyboardWillHide: dan pilih tempat yang sesuai untuk memperbaiki ukuran tableView Anda.
Sekarang di sini bit pengguliran, kita kerjakan beberapa ukuran terlebih dahulu, kemudian kita lihat di mana kita berada di area yang terlihat, dan atur rect yang ingin kita gulir menjadi setengah tampilan di atas atau di bawah bagian tengah bidang teks berdasarkan di tempat itu dalam tampilan. Dalam hal ini, kami memiliki larik UITextFields dan enum yang melacaknya, jadi mengalikan barisHeight dengan nomor baris memberi kami offset bingkai yang sebenarnya dalam tampilan luar ini.
Ini tampaknya bekerja dengan sangat baik.
sumber
UIKeyboardBoundsUserInfoKey
sudah ditinggalkan sejak iOS 3.2. Lihat solusi saya di bawah ini yang bekerja di semua rilis iOS saat ini ≥ 3.0. / @ iPhoneDevJika Anda dapat menggunakan
UITableViewController
, Anda mendapatkan fungsionalitas secara gratis. Namun, kadang-kadang, ini bukan opsi, khususnya jika Anda memerlukan banyak tampilan, bukan hanyaUITableView
.Beberapa solusi yang disajikan di sini tidak bekerja di iOS ≥4, beberapa tidak berfungsi di iPad atau dalam mode lansekap, beberapa tidak bekerja untuk keyboard Bluetooth (di mana kami tidak ingin ada pengguliran), beberapa tidak berfungsi saat beralih di antara beberapa bidang teks. Jadi, jika Anda memilih solusi apa pun, pastikan untuk menguji kasus ini. Ini adalah solusi yang kami
gunakandigunakan di InAppSettingsKit :Berikut kode lengkap kelas di InAppSettingsKit. Untuk mengujinya, gunakan panel anak "Daftar Lengkap" tempat Anda dapat menguji skenario yang disebutkan di atas.
sumber
Solusi paling sederhana untuk Swift :
sumber
Saya harap kalian sudah mendapat solusi membaca semua itu. Tetapi saya menemukan solusi saya sebagai berikut. Saya berharap Anda sudah memiliki sel
UITextField
. Jadi pada persiapan, pertahankan saja indeks baris ke dalam tag bidang teks.Buat
activeTextField
instanceUITextField
dengan lingkup global seperti di bawah ini:Jadi, sekarang Anda tinggal menyalin paste kode saya di akhir. Dan juga jangan lupa menambahkan
UITextFieldDelegate
Mendaftarkan keyboard
notifications
Menangani Keyboard
Notifications
:Dipanggil ketika
UIKeyboardDidShowNotification
dikirim.Disebut saat itu
UIKeyboardWillHideNotification
dikirimSekarang satu hal yang tersisa, Panggil
registerForKeyboardNotifications
metode keViewDidLoad
metode sebagai berikut:Anda selesai, semoga Anda
textFields
tidak lagi disembunyikan oleh keyboard.sumber
Menggabungkan dan mengisi bagian yang kosong dari beberapa jawaban (khususnya Ortwin Gentz, pengguna 98013) dan pos lainnya, ini akan berfungsi di luar kotak untuk SDK 4.3 pada iPad dalam mode Portrait atau Landscape:
sumber
Jika Anda menggunakan tampilan uitable untuk menempatkan bidang teks Anda ( dari Jeff Lamarche ), Anda bisa menggulir tampilan tabel menggunakan metode delegasi seperti itu.
(Catatan: bidang teks saya disimpan dalam array dengan indeks yang sama dengan baris yang ada di tampilan tabel)
sumber
Notifikasi keyboard berfungsi, tetapi kode sampel Apple untuk itu mengasumsikan bahwa tampilan gulir adalah tampilan root dari jendela. Ini biasanya tidak demikian. Anda harus mengimbangi bilah tab, dll., Untuk mendapatkan offset yang tepat.
Itu lebih mudah daripada kedengarannya. Berikut adalah kode yang saya gunakan dalam UITableViewController. Ini memiliki dua variabel instan, hiddenRect dan keyboardShown.
sumber
UIKeyboardCenterEndUserInfoKey
danUIKeyboardBoundsUserInfoKey
sudah tidak digunakan lagi di iOS 3.2. Lihat solusi saya di bawah ini yang bekerja di semua rilis iOS saat ini ≥ 3.0.Jika Anda menggunakan
Three20
, maka gunakanautoresizesForKeyboard
properti. Cukup setel pada-initWithNibName:bundle
metode pengontrol tampilan AndaIni menangani:
Dilakukan dan dilakukan.
sumber
Pendekatan saya:
Saya pertama-tama subkelas UITextField dan menambahkan properti indexPath. Di cellFor ... Metode saya menyerahkan properti indexPath.
Lalu saya tambahkan kode berikut:
ke textFieldShould / WillBegin ... dll.
Ketika Keyboard menghilang, Anda harus membaliknya dengan:
sumber
Solusi yang lebih stream-lined. Itu tergelincir ke dalam metode delegasi UITextField, sehingga tidak perlu mengacaukan notifikasi UIKeyboard.
Catatan implementasi:
kSettingsRowHeight - ketinggian UITableViewCell.
offsetTarget dan offsetThreshold didukung dari kSettingsRowHeight. Jika Anda menggunakan ketinggian baris yang berbeda, atur nilai-nilai itu ke properti titik y. [alt: hitung offset baris dengan cara yang berbeda.]
}
}
sumber
Gunakan
UITextField's
delegate
metode:Cepat
Objektif-C
sumber
Solusi lengkap Swift 4.2
Saya telah membuat GIST dengan seperangkat protokol yang menyederhanakan pekerjaan dengan menambahkan ruang ekstra saat keyboard ditampilkan, disembunyikan, atau diubah.
Fitur :
Pemakaian
Contoh penggunaan dasar dalam pengontrol tampilan yang berisi beberapa tampilan gulir (tampilan tabel tentu saja didukung).
Inti: pengamat perubahan bingkai
Protokol
KeyboardChangeFrameObserver
akan memecat acara setiap kali bingkai keyboard diubah (termasuk menampilkan, menyembunyikan, mengubah bingkai).addKeyboardFrameChangesObserver()
diviewWillAppear()
atau metode serupa.removeKeyboardFrameChangesObserver()
diviewWillDisappear()
atau metode serupa.Implementasi: tampilan gulir
ModifableInsetsOnKeyboardFrameChanges
protokol menambahkanUIScrollView
dukungan ke protokol inti. Ini mengubah insets tampilan gulir ketika bingkai keyboard diubah.Kelas Anda perlu mengatur tampilan gulir, insets seseorang akan bertambah / berkurang pada perubahan bingkai keyboard.
sumber
Karena Anda memiliki bidang teks dalam tabel, cara terbaik sebenarnya adalah mengubah ukuran tabel - Anda perlu mengatur ketinggian tableView.frame menjadi lebih kecil dengan ukuran keyboard (saya pikir sekitar 165 piksel) dan kemudian perluas lagi ketika keyboard diberhentikan.
Anda juga dapat menonaktifkan interaksi pengguna untuk tableView pada saat itu, jika Anda tidak ingin pengguna menggulir.
sumber
Ini berfungsi dengan baik, dan juga pada iPad.
sumber
Saya mencoba pendekatan yang hampir sama dan menghasilkan kode yang lebih sederhana dan lebih kecil untuk hal yang sama. Saya membuat iTextView IBOutlet dan dikaitkan dengan UITextView di IB.
sumber
Jadi setelah berjam-jam pekerjaan yang melelahkan mencoba menggunakan solusi saat ini (dan benar-benar gagal) saya akhirnya berhasil dengan baik, dan memperbaruinya untuk menggunakan blok animasi baru. Jawaban saya sepenuhnya berdasarkan jawaban Ortwin di atas .
Jadi untuk alasan apa pun kode di atas tidak berfungsi untuk saya. Pengaturan saya sepertinya cukup mirip dengan yang lain, tapi mungkin karena saya menggunakan iPad atau 4.3 ... tidak tahu. Itu melakukan beberapa matematika aneh dan menembak tampilan meja saya dari layar.
Lihat hasil akhir dari solusi saya: http://screencast.com/t/hjBCuRrPC (Harap abaikan foto. :-P)
Jadi saya pergi dengan intisari dari apa yang dilakukan Ortwin, tetapi mengubah bagaimana melakukan beberapa matematika untuk menjumlahkan asalnya. Y & ukuran. Tinggi tampilan meja saya dengan ketinggian keyboard. Ketika saya mengurangi ketinggian jendela dari hasil itu, ia memberi tahu saya berapa banyak persimpangan yang telah saya lakukan. Jika lebih besar dari 0 (alias ada beberapa tumpang tindih) saya melakukan animasi ketinggian bingkai.
Selain itu ada beberapa masalah menggambar ulang yang diselesaikan dengan 1) Menunggu untuk menggulir ke sel sampai animasi selesai dan 2) menggunakan opsi UIViewAnimationOptionBeginFromCurrentState saat menyembunyikan keyboard.
Beberapa hal yang perlu diperhatikan.
Sekali lagi, saya tidak akan mendekati jawaban ini jika saya Ortwin tidak memberikan inti dari itu. Ini kodenya:
sumber
Soluton ini berfungsi untuk saya, HARAP perhatikan barisnya
Anda dapat mengubah nilai 160 agar cocok dengan itu bekerja dengan Anda
sumber
Diskusi thread yang sangat menarik, saya juga menghadapi masalah yang sama mungkin lebih buruk karena
Jadi baca utasnya di sini dan terapkan versi saya, yang membantu saya mendorong konten saya di iPad dalam mode lansekap . Berikut ini kode (ini bukan bukti bodoh dan semuanya, tetapi ini memperbaiki masalah saya) Pertama, Anda perlu memiliki delegasi di kelas sel khusus Anda, yang saat pengeditan dimulai, mengirimkan textfield ke ur viewcontroller Anda dan mengatur activefield = theTextField di sana
// DITERAPKAN HANYA UNTUK MENANGANI MODEL LANDSCAPE
// Dipanggil ketika UIKeyboardWillHideNotification dikirim
-anoop4real
sumber
Saya baru saja menyelesaikan masalah seperti itu sendiri setelah saya merujuk sejumlah besar solusi yang ditemukan melalui Google dan Stack Overflow.
Pertama, harap pastikan bahwa Anda telah menyiapkan IBOutlet dari UIScrollView Anda, Kemudian silakan lihat lebih dekat di Apple Doc: Keyboard Management . Terakhir, jika Anda dapat menggulir latar belakang, tetapi keyboard masih menutupi Bidang Teks, silakan lihat bagian kode ini:
Perbedaan utama antara bagian ini dan Apple terletak pada kondisi if. Saya percaya perhitungan jarak gulir dan kondisi apel apakah bidang teks yang dicakup oleh keyboard tidak akurat, jadi saya membuat modifikasi seperti di atas.
Beri tahu saya jika berhasil
sumber
Contoh di Swift, menggunakan titik persis bidang teks dari Dapatkan indexPath dari UITextField di UITableViewCell dengan Swift :
sumber
Metode mudah lainnya (hanya bekerja dengan satu bagian)
sumber
Jika UITableView Anda dikelola oleh subkelas dari UITableViewController dan bukan UITableView, dan delegasi bidang teks adalah UITableViewController, ia harus mengelola semua pengguliran secara otomatis - semua komentar lain ini sangat sulit diterapkan dalam praktiknya.
Untuk contoh yang baik, lihat proyek kode contoh apel: TaggedLocations.
Anda dapat melihatnya menggulir secara otomatis, tetapi sepertinya tidak ada kode yang melakukan ini. Proyek ini juga memiliki sel tampilan tabel khusus, jadi jika Anda membangun aplikasi Anda dengan itu sebagai panduan, Anda harus mendapatkan hasil yang diinginkan.
sumber
Inilah cara saya membuat karya ini, yang merupakan campuran dari jawaban Sam Ho dan Marcel W, dan beberapa perbaikan bug saya dibuat untuk kode jelek saya. Saya menggunakan UITableViewController. Tabel sekarang mengubah ukuran dengan benar ketika keyboard ditampilkan.
1) Dalam
viewDidLoad
saya menambahkan:self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
2) Saya lupa menyebut
super
padanan dalamviewWillAppear
danawakeFromNib
. Saya menambahkan ini kembali.sumber
UITableViewController
apakah Scrolling secara otomatis, memang. Perbedaannya dibandingkan dengan menggunakan aUIViewController
adalah, bahwa Anda harus membuat Navbar-Buttonitems secara terprogram dengan menggunakanNavigationController
, saat menggunakan aTableViewController
.sumber