Saya mencoba membangun layar input untuk iPhone. Layar memiliki sejumlah bidang input. Kebanyakan dari mereka ada di bagian atas layar, tetapi ada dua bidang di bagian bawah. Ketika pengguna mencoba mengedit teks di bagian bawah layar, keyboard akan muncul dan akan menutupi layar. Saya menemukan solusi sederhana untuk memindahkan layar ke atas ketika ini terjadi, tetapi hasilnya adalah layar selalu bergerak ke atas dan bidang di atas layar keluar dari jangkauan ketika pengguna mencoba mengeditnya.
Apakah ada cara agar layar hanya bergerak ketika bidang bawah diedit?
Saya telah menggunakan kode ini yang saya temukan di sini :
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Jawaban:
Masalah Anda dijelaskan dengan baik dalam dokumen ini oleh Apple . Contoh kode pada halaman ini (at
Listing 4-1
) melakukan apa yang Anda butuhkan, itu akan menggulir tampilan Anda hanya ketika pengeditan saat ini harus di bawah keyboard. Anda hanya perlu meletakkan kontrol yang dibutuhkan di scrollViiew. Satu-satunya masalah adalah bahwa ini adalah Objective-C dan saya pikir Anda memerlukannya di Swift..so..di sini adalah:Deklarasikan variabel
lalu tambahkan metode ini
Pastikan untuk mendeklarasikan ViewController Anda sebagai
UITextFieldDelegate
dan setel delegasi yang benar dalam metode inisialisasi Anda: mis:Dan ingat untuk memanggil
registerForKeyboardNotifications
viewInit danderegisterFromKeyboardNotifications
keluar.Edit / Perbarui: Sintaks 4.2 Swift
sumber
UIKeyboardFrameEndUserInfoKey
bukanUIKeyboardFrameBeginUserInfoKey
, karena yang terakhir mengembalikan tinggi 0. Dan mengubah titik paling tinggi ke bawah bukan asal.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
metode ini disebut SETELAHkeyboardWillShow
metode itu dipanggil. Akibatnya,activeField
variabel tersebut masih nol, yang berarti tidak ada pengguliran otomatis terjadi. Solusi saya adalah denganactiveField = textField
menelepon metode textFieldshouldBeginEditing
. Ini menyelesaikan masalah urutan panggilan.Inilah 2 sen saya:
Sudahkah Anda mencoba: https://github.com/hackiftekhar/IQKeyboardManager
Sangat mudah untuk menginstal Swift atau Objective-C.
Di sini cara kerjanya:
IQKeyboardManager (Swift): - IQKeyboardManagerSwift tersedia melalui CocoaPods, untuk menginstalnya cukup tambahkan baris berikut ke Podfile Anda: (# 236)
Di AppDelegate.swift, cukup impor kerangka kerja IQKeyboardManagerSwift dan aktifkan IQKeyboardManager.
Dan itu saja. Mudah!
sumber
IQKeyboardManager.shared.enable = true
Yang saya temukan berfungsi sempurna bagi saya adalah ini:
Anda juga dapat mengubah nilai ketinggian. Hapus "jika pernyataan" jika Anda ingin menggunakannya untuk semua bidang teks.
Anda bahkan dapat menggunakan ini untuk semua kontrol yang memerlukan input pengguna seperti TextView.
sumber
Saya memiliki masalah yang sama dan menemukan solusi yang cukup mudah tanpa menggunakan scrollView, dan sebagai gantinya menggunakan pernyataan if dalam metode keyboardWillShow / Sembunyikan.
Ini adalah solusi yang baik bagi saya karena saya hanya memiliki dua bidang teks.
Menggeser seluruh tampilan ke atas: hanya ketika bidang teks tertentu (teks bawah) diedit
Menggeser seluruh tampilan ke bawah: hanya saat tampilan tidak di lokasi asli
sumber
Cukup gunakan ekstensi ini untuk memindahkan UIView saat keyboard disajikan.
Kemudian di viewdidload, ikat tampilan Anda ke keyboard
sumber
Mengapa tidak menerapkan ini dalam UITableViewController saja? Keyboard tidak akan menyembunyikan bidang teks apa pun saat ditampilkan.
sumber
Swift 4 (** diperbarui ) dengan ekstensi **
inViewDidLoad
tambahkan ekstensi berikut
sumber
Saya menggunakan SwiftLint, yang memiliki beberapa masalah dengan pemformatan jawaban yang diterima. Secara khusus:
tidak ada ruang sebelum titik dua, tidak ada pengecoran paksa, lebih suka UIEdgeInset (atas: dll ... daripada UIEdgeInsetMake.
jadi inilah pembaruan untuk Swift 3
sumber
Saya pikir klausa ini salah:
Meskipun asal activeField mungkin berada di atas keyboard, maxY mungkin tidak ...
Saya akan membuat titik 'max' untuk activeField dan memeriksa apakah itu ada di keyboard Rect.
sumber
Ini versi saya setelah membaca dokumentasi yang disediakan oleh Apple dan posting sebelumnya. Satu hal yang saya perhatikan adalah bahwa textView tidak ditangani ketika ditutupi oleh keyboard. Sayangnya, dokumentasi Apple tidak akan berfungsi karena, untuk alasan apa pun, keyboard disebut SETELAH textViewDidBeginEditing disebut. Saya menangani ini dengan memanggil metode pusat yang memeriksa apakah keyboard ditampilkan DAN jika textView atau textField sedang diedit. Dengan cara ini, proses hanya dipecat ketika kondisi KEDUA ada.
Poin lain dengan textViews adalah bahwa tingginya mungkin sedemikian rupa sehingga keyboard klip bagian bawah textView dan tidak akan menyesuaikan jika titik Kiri-Atas dari yang terlihat. Jadi, kode yang saya tulis benar-benar mengambil titik Bawah-Kiri layar-direferensikan dari textView atau textField dan melihat apakah itu jatuh dalam koordinat yang direferensikan layar dari keyboard yang disajikan menyiratkan bahwa keyboard mencakup sebagian dari itu.
Jika Anda menggunakan pengontrol navigasi, subkelas ini juga mengatur penyesuaian otomatis tampilan gulir untuk inset menjadi false.
Itu berjalan melalui setiap textView dan textField untuk mengatur delegasi untuk penanganan
Cukup atur kelas dasar Anda ke subclass yang dibuat di sini untuk hasil.
sumber
Jawaban yang luar biasa sudah diberikan tetapi ini adalah cara yang berbeda untuk menghadapi situasi ini (menggunakan Swift 3x ):
Pertama-tama panggil metode berikut ini di
viewWillAppear()
Sekarang mengambil salah satu
IBOutlet
dariUIView
kendala atas 's dari AndaUIViewcontroller
seperti ini: (di siniUIView
adalah subviewUIScrollView
berarti bahwa Anda harus memilikiUIScrollView
untuk semua AndasubViews
)Dan variabel lain seperti mengikuti dan menambahkan delegasi yaitu
UITextFieldDelegate
:Setelah itu di sini adalah bagian ajaib cukup tempelkan cuplikan di bawah ini :
Sekarang cuplikan terakhir:
Jangan lupa untuk delegasi assign ke semua Anda
UITextField
s diUIStoryboard
Semoga berhasil!
sumber
Sintaks Swift 3:
ini adalah metode yang bagus untuk mendapatkan apa yang Anda inginkan, Anda dapat menambahkan kondisi "jika" untuk bidang teks tertentu tetapi jenis ini berfungsi untuk semua ... Semoga bermanfaat bagi semua orang
sumber
Pertama-tama deklarasikan variabel untuk mengidentifikasi UITextField aktif Anda.
Langkah 1:-
Seperti
var activeTextField: UITextField
?Langkah 2: - Setelah ini tambahkan dua baris ini di viewDidLoad.
Langkah 3: -
Sekarang tentukan kedua metode ini di kelas controller Anda.
sumber
Buat var dari uitextfield
Dalam pemuatan viewdid Anda
Ketahui bidang teks yang diklik. mungkin Anda memiliki bidang teks di seluruh layar.
Periksa apakah keyboard menutupi bidang teks atau tidak.
Kembali untuk menutup keyboard
UPDATE: NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide diubah namanya menjadi UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification masing-masing.
sumber
Swift : Anda dapat melakukan ini dengan memeriksa textField mana yang sedang disajikan.
sumber
Kode ini bergerak ke atas bidang teks yang sedang Anda edit sehingga Anda dapat melihatnya di Swift 3 untuk jawaban ini Anda juga harus membuat tampilan Anda menjadi UITextFieldDelegate:
Dan kemudian di viewDidLoad:
Panggilan mana (di luar viewDidLoad):
sumber
Cepat 3
sumber
Server yang diterima hampir sempurna. Tapi saya perlu menggunakan
UIKeyboardFrameEndUserInfoKey
bukanUIKeyboardFrameBeginUserInfoKey,
karena keyborad tinggi mengembalikan 0,90. Dan mengubah titik paling tinggi ke bawah bukan asal.sumber
Swift 4 Memperbarui solusi saya
dengan animasi kendala di acara keyboard / sembunyikan, selamat menikmati.
sumber
Cepat 4
Anda dapat dengan mudah bergerak naik dan turun
UITextField
dengan keyboard dengan animasisumber
Cepat 4.2
Solusi saya akan (secara vertikal) memusatkan tampilan pada a
UITextField
jika posisinya di bawah keyboard.Langkah 1: Buat file cepat baru dan
UIViewWithKeyboard
kelas salin-tempel .Langkah 2: Di Interface Builder aturlah sebagai Kelas Kustom untuk yang paling top Anda
UIView
.sumber
Ditulis ulang untuk swift 4.2
Di ViewDidLoad ..
Funtions yang tersisa
sumber
"Saya lupa menyebutkan bahwa saya baru di Swift :( Apa sintaks yang benar untuk memeriksa ini? (Bagaimana cara mendapatkan nama bidang dalam fungsi ini?)"
Baik . Pertama konfirmasikan ke protokol UITextFieldDelegate
Kemudian implementasikan fungsinya
Anda harus mencatat bahwa pendekatan yang tepat adalah dengan menggunakan tampilan gulir dan menempatkan tampilan yang harus digeser ke atas / ke bawah di dalam tampilan gulir dan menangani kejadian keyboard yang sesuai.
sumber
Untuk Swift 4.2
Kode ini akan memungkinkan Anda untuk mengontrol momen sumbu Y dari frame untuk ukuran layar perangkat tertentu.
PS: Kode ini tidak akan memindahkan frame secara cerdas berdasarkan lokasi TextField.
Buat ekstensi untuk UIDevice
Tambahkan NotificationObserver di viewDidLoad
Pemilih
sumber