Saya memiliki aplikasi di mana, di Interface Builder , saya menyiapkan UIView
yang memiliki bidang teks di dekat bagian bawah tampilan. Ketika saya menjalankan aplikasi dan mencoba memasukkan teks ke dalam bidang itu, papan ketik bergeser ke atas bidang tersebut sehingga saya tidak dapat melihat apa yang saya ketik sampai saya menyembunyikan papan ketik itu lagi.
Apakah ada orang lain yang mengalami masalah ini dan menemukan cara yang baik untuk menyelesaikannya tanpa membuat tampilan induk dapat digulir atau memindahkan bidang teks lebih jauh ke atas layar?
ios
iphone
keyboard
uitextfield
Cruinh
sumber
sumber
Jawaban:
Solusi yang biasa adalah menggeser bidang (dan semua yang ada di atasnya) ke atas dengan animasi, dan kemudian mundur setelah selesai. Anda mungkin perlu meletakkan bidang teks dan beberapa item lainnya ke tampilan lain dan menggeser tampilan sebagai satu unit. (Saya menyebutnya "lempeng" seperti "lempeng tektonik", tapi itu hanya saya). Tapi inilah gambaran umumnya jika Anda tidak perlu menjadi mewah.
sumber
Ini berhasil keajaiban bagi saya menggeser bidang uitext
Secara khusus ini memiliki keuntungan dalam menghitung jarak animasi slide tergantung pada posisi bidang teks.
sumber
IQKeyboardManager melakukan ini untuk Anda TANPA BARIS KODE , hanya perlu menyeret dan melepas file sumber terkait ke proyek. IQKeyboardManager juga mendukung Orientasi Perangkat , Manajemen UIToolbar Otomatis , keyboardDistanceFromTextField , dan banyak lagi dari yang Anda kira.
Berikut adalah Diagram Alir Kontrol:
Langkah 1: - Ditambahkan pemberitahuan global
UITextField
,UITextView
danUIKeyboard
di kelas tunggal. Saya menyebutnya IQKeyboardManager .Langkah2: - Jika ditemukan
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
atauUITextViewTextDidBeginEditingNotification
pemberitahuan, maka coba dapatkantopMostViewController
instance dariUIWindow.rootViewController
hierarki. Untuk mengungkapUITextField
/UITextView
di atasnya dengan benar,topMostViewController.view
bingkai perlu disesuaikan.Langkah 3 : - Menghitung jarak pergerakan yang diharapkan
topMostViewController.view
sehubungan dengan respons pertamaUITextField
/UITextView
.Step4: - Pindah ke
topMostViewController.view.frame
atas / bawah sesuai dengan jarak pergerakan yang diharapkan.Step5: - Jika ditemukan
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
atauUITextViewTextDidEndEditingNotification
notifikasi, maka coba lagi untuk mendapatkantopMostViewController
instance dariUIWindow.rootViewController
hierarki.Langkah 6: - Jarak terputus yang dihitung
topMostViewController.view
yang perlu dikembalikan ke posisi semula.Step7: - Dipulihkan
topMostViewController.view.frame
sesuai dengan jarak yang terganggu.Langkah 8: - Instance kelas IQKeyboardManager tunggal yang dibuat instance-nya saat aplikasi dimuat, sehingga setiap
UITextField
/UITextView
dalam aplikasi akan menyesuaikan secara otomatis sesuai dengan jarak pergerakan yang diharapkan.Itu saja
sumber
Untuk memperluas jawaban Amagrammer, berikut adalah contoh kelasnya:
LoginViewController.h
Perhatikan bahwa kami sedang mengimplementasikan "UITextFieldDelegate"
LoginViewController.m
sumber
UIApplicationDidEnterBackgroundNotification
, jika tidak maka akan bergerak lebih ke bawah jika seseorang menekan tombol Beranda dan kembali lagi ke aplikasi, menyebabkannya jelek dan buggy.Bagaimana dengan solusi resminya: Memindahkan Konten Yang Terletak Di Bawah Keyboard
sumber
Saya menghadapi masalah yang sama di
UITableView
sel bidang teks. Saya mengatasi masalah ini dengan menerapkan metode berikut untuk mendengarkan pemberitahuan keyboard.Perhatikan notifikasi di sini:
Tangani notifikasi tersebut dengan menggunakan fungsi di bawah ini:
sumber
Lihat ini. Tidak merepotkan Anda.
Solusi ini sangat rapi. Yang harus Anda lakukan adalah menambahkan bidang teks Anda di a
UIScrollView
dan mengubah kelasnya menjadiTPKeyboardAvoidingScollView
, jika Anda menggunakan papan cerita. Tampilan gulir diperpanjang sedemikian rupa sehingga akan mendeteksi saat keyboard terlihat dan akan bergerak sendiri di atas keyboard pada jarak yang wajar. Ini adalah solusi sempurna karena tidak bergantung pada AndaUIViewController
. Setiap hal yang diperlukan dilakukan dalam kelas yang disebutkan di atas. Terima kasih Michael Tyson dkk.TPKeyboardMenghindari
sumber
Di bawah ini adalah versi cepat dari jawaban Amagrammer. Juga, variasi menggunakan acara UIKeyboardWillShowNotification karena saya perlu mengetahui ukuran keyboard sebelum memindahkan tampilan.
sumber
Ada panduan hebat dalam mengedit bidang teks tanpa mengaburkan (tautan mati sekarang, inilah tautan Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / mengedit-bidang teks-tanpa-obscuring.html ). Ini menunjukkan cara memindahkan yang ada
UIView
ke aUIScrollView
, dan menggulirnya secara otomatis saat keyboard muncul.Saya telah memperbaruinya sedikit untuk menghitung ketinggian yang benar
UIScrollView
ketika ada kontrol (seperti aUITabBar
) di bawahUIScrollBar
. Lihat posting memperbarui tampilan .sumber
Berikut solusi menggunakan Xcode5, iOS7:
Gunakan blok UITextfieldDelegate dan animasi.
Ini hampir semua kode untuk ViewController tetapi saya ingin menyertakan kode delegasi untuk mereka yang masih agak asing dengan pola delegasi (seperti saya). Saya juga menyertakan kode untuk menyembunyikan keyboard saat Anda mengetuk keluar dari tampilan teks.
Anda dapat memindahkan tampilan (tombol, bidang teks, dll) setinggi yang Anda inginkan, pastikan untuk mengembalikannya ke tempatnya (+100 lalu -100).
sumber
Saya kira salah satu cara akan memindahkan seluruh posisi tampilan Anda dari (x, y) ke (x, y-keybaardHeight) saat textfield diklik dan mengembalikannya saat keyboard ditutup, mungkin terlihat sedikit aneh sebagai tampilan saja muncul (mungkin tidak akan buruk jika Anda menghidupkannya).
sumber
Selain solusi Amagrammer, jika Anda menggunakan cocos2d dalam mode potret, ubah baris ini:
untuk ini:
Jika Anda menggunakan cocos2d dalam mode lanskap, lakukan perubahan di atas dan ubah
up
nilainya menjaditextFieldDidBeginEditing:
dantextFieldDidEndEditing:
sumber
Saya memiliki masalah yang sama dan menemukan GTKeyboardHelper sebagai jalan keluar yang mudah.
Setelah drag and drop kerangka dalam proyek Anda, sertakan file header. Unduh dan buka proyek contoh, lalu seret objek "Pembantu Keyboard" dari bagian objek di xib ke bagian objek di pembuat antarmuka proyek Anda.
Tarik dan lepas semua tampilan Anda untuk menjadi anak-anak "Pembantu Keyboard".
sumber
Seret dan lepas kerangka kerja yang saya gunakan dalam proyek saya. Mendukung pemecatan otomatis saat Anda mengetuk di luar responden pertama atau saat Anda menggulir.
GTKeyboardHelper
sumber
Geser tampilan ke atas dan ke bawah sesuai kebutuhan:
Jangan lupa untuk menetapkan
self
sebagaiUITextFieldDelegate
dan sebagai bidang teks sebenarnyadelegate
.(Terima kasih kepada Ammagrammer, ini hanya jawaban yang lebih singkat menggunakan blok untuk animasi)
sumber
Saya punya sesuatu yang lain jika Anda mau. Intinya di sini adalah Anda ingin mengatur pusat UIView Anda pada bidang teks yang sedang Anda edit.
Sebelum itu, Anda harus menyimpan INITIAL_CENTER Anda , sebagai CGPoint , dari self.view.center dan INITIAL_VIEW Anda sebagai CGRect dari self.view.frame di properti const.
Anda dapat membuat metode seperti ini:
Kemudian, pada UITextFieldDelegate , Anda harus menghubungi centerOn: (CGRect) dengan metode berikut:
textFieldDidBeginEditing: (UITextField *) dengan, sebagai parameter, bingkai bidang teks yang ingin Anda pusatkan .
Dan Anda harus memanggilnya di event handler, tempat Anda menutup keyboard,
textFieldDidEndEditing: (UITextField *) bisa menjadi salah satu cara untuk melakukannya, dengan menempatkan INITIAL_VIEW sebagai parameter centerOn: (CGRect) .
sumber
Saya percaya pada versi iOS yang lebih baru (6.1+, bahkan mungkin lebih awal), tampilan yang mendasarinya, setidaknya untuk UITableView, menyusut otomatis saat keyboard muncul. Jadi, Anda hanya perlu membuat bidang teks terlihat dalam tampilan itu. Masuk
init
:kemudian:
sumber
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Saya harap solusi ini membantu. Semuanya ditulis Swift 3.
sumber