Saya menggunakan Swift untuk pemrograman dengan iOS dan saya menggunakan kode ini untuk memindahkan UITextField
, tetapi tidak berfungsi. Saya memanggil fungsi keyboardWillShow
dengan benar, tetapi bidang teks tidak bergerak. Saya menggunakan pembayaran otomatis.
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);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
sumber
sumber
Jawaban:
Ada beberapa perbaikan yang harus dilakukan pada jawaban yang ada.
Pertama, UIKeyboardWillChangeFrameNotification mungkin adalah notifikasi terbaik karena menangani perubahan yang tidak hanya menampilkan / menyembunyikan tetapi juga perubahan karena perubahan keyboard (bahasa, menggunakan keyboard pihak ke-3 dll.) Dan rotasi juga (tetapi komentar di bawah ini menunjukkan bahwa keyboard akan disembunyikan jika harus juga ditangani untuk mendukung koneksi keyboard perangkat keras).
Kedua, parameter animasi dapat ditarik dari notifikasi untuk memastikan bahwa animasi disatukan dengan benar.
Mungkin ada opsi untuk membersihkan kode ini sedikit lebih terutama jika Anda merasa nyaman dengan membuka bungkusan kode kamus.
Cepat 3
(Diedit ke akun untuk keyboard yang menghidupkan layar bukan mengecil, sesuai dengan komentar luar biasa @ Gabox di bawah)
Cepat 5
sumber
endFrame?.size.height
tidak ada nihil. Saya mendapat bingkai akhir sebagaiUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Berlari di iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4..UIKeyboardWillChangeFrame
tidak menyala ketika keyboard perangkat keras terhubung, meskipun keyboard iOS menghilang. Anda perlu mengamati.UIKeyboardWillHide
juga untuk menangkap kasing tepi itu.Jika Anda menggunakan Tata Letak Otomatis, saya berasumsi Anda telah menetapkan Batas Bawah untuk batasan Superview . Jika itu masalahnya, Anda hanya perlu memperbarui nilai kendala. Begini cara Anda melakukannya dengan sedikit animasi.
Hardcoded 20 ditambahkan hanya untuk memunculkan textfield sedikit di atas keyboard. Kalau tidak, margin atas keyboard dan margin bawah textfield akan menyentuh.
Saat keyboard diberhentikan, setel ulang nilai kendala ke nilai aslinya.
sumber
UIKeyboardWillShowNotification
pemberitahuan. Lihatlah kode dalam pertanyaan OP.animateWithDuration
dan panggilself.view.layoutIfNeeded()
di dalam blok animate.Solusi sederhana adalah menggerakkan tampilan ke atas dengan ketinggian keyboard konstan.
Swift 5:
sumber
self.view.frame.origin.y -= 150
penggunaanself.view.frame.origin.y = -150
dan bukanself.view.frame.origin.y += 150
penggunaanself.view.frame.origin.y = 0
. Ini mencegah pandangan bergerak 150 setiap kali bidang baru disentuh.Untuk memindahkan tampilan Anda saat mengedit bidang teks coba ini, saya telah menerapkan ini,
Opsi 1: - ** ** Pembaruan dalam Swift 5.0 dan iPhone X, XR, XS dan XS Max Pindah menggunakan NotificationCenter
Daftarkan Notifikasi ini di
func viewWillAppear(_ animated: Bool)
Daftarkan Notifikasi ini di
func viewWillDisappear(_ animated: Bool)
Catatan: - Jika Anda tidak akan membatalkan pendaftaran daripada panggilan dari kelas anak dan akan menyebabkan crash atau yang lain.
Opsi 2: - Ini berfungsi dengan baik
Saya mendapat jawaban ini dari sumber ini UITextField bergerak ke atas saat keyboard muncul di Swift
DALAM Swift 4 ---
sumber
Saya suka kode Swift bersih. Jadi, inilah kode paling ketat yang bisa saya buat untuk memindahkan tampilan teks naik / turun dengan keyboard. Saat ini bekerja di aplikasi produksi iOS8 / 9 Swift 2.
UPDATE (Maret 2016): Saya hanya memperketat kode saya sebelumnya sebanyak mungkin. Juga, ada banyak jawaban populer di sini yang meng-hardcode tinggi keyboard dan parameter animasi. Tidak perlu untuk itu, belum lagi angka-angka dalam jawaban ini tidak selalu sejalan dengan nilai aktual yang saya lihat di 6s + iOS9 saya (tinggi keyboard 226, durasi 0,25, dan kurva animasi 7). Bagaimanapun, hampir tidak ada kode tambahan untuk mendapatkan nilai-nilai itu langsung dari sistem. Lihat di bawah.
CATATAN: Kode ini mencakup sebagian besar komentar / kasus umum. Namun, lebih banyak kode mungkin diperlukan untuk menangani berbagai orientasi dan / atau keyboard khusus Berikut adalah artikel mendalam tentang cara bekerja dengan keyboard iOS. Jika Anda perlu menangani setiap skenario, ini dapat membantu.
sumber
as
untuk gips kekuatan.as!
dapat bekerja tetapi seperti yang Anda lihat di bagian lain halaman ini saya menghindari gips paksa dan memaksa membuka diri.baseConstraint
, mungkin itubaseConstraint.constant = moveUp ? keyboardHeight : 0
bukanbaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Sunting : Saya merekomendasikan solusi yang lebih mudah dan bersih. Cukup ubah kelas batasan spasi bawah menjadi KeyboardLayoutConstraint . Ini akan secara otomatis memperluas ke ketinggian keyboard.
Ini adalah versi yang lebih baik dari jawaban @JosephLord.
Seperti yang diuji pada iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4, saya menemukan jawabannya tidak bekerja ketika keyboard bersembunyi karena
UIKeyboardFrameEndUserInfoKey
adalah"NSRect: {{0, 1024}, {768, 264}}";
. Tingginya tidak pernah0
.Ini kembali menggunakan tradisional
UIKeyboardWillShowNotification
danUIKeyboardWillHideNotification
untuk lebih mengetahui kapan keyboard bersembunyi daripada mengandalkan ketinggian frame akhir.UIKeyboardWillShowNotification
juga dikirim ketika bingkai keyboard diubah sehingga harus mencakup semua kasus penggunaan.sumber
saya bekerja dengan swift 4 dan saya menyelesaikan masalah ini tanpa menggunakan kendala tambahan bawah melihat kode saya di sini. benar-benar bekerja pada kasus saya
1) Tambahkan Pengamat Pemberitahuan dalam melakukan memuat
2) Hapus suka Pemberitahuan Pengamat
3) Tambahkan acara keyboard / sembunyikan metode suka
4) Tambahkan delegasi textfeild dan tambahkan touchMulai metode .usefull untuk menyembunyikan keyboard ketika menyentuh di luar textfeild di layar
sumber
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
UIResponder.keyboardWillShowNotification
UIKeyboardFrameBeginUserInfoKey
UIResponder.keyboardFrameBeginUserInfoKey
Ini adalah versi perbaikan dari @JosephLord dan jawaban @ Hlung. Itu bisa berlaku apakah Anda memiliki tabbar atau tidak. Dan itu akan mengembalikan tampilan yang dipindahkan oleh keyboard ke posisi semula dengan sempurna.
sumber
Cara termudah yang tidak memerlukan kode apa pun:
Objek akan dipindahkan secara otomatis dengan keyboard, dalam sinkronisasi.
sumber
Saya membuat protokol Swift 3 untuk menangani tampilan / hilangnya keyboard
Kemudian, untuk mengimplementasikannya dalam UIViewController, lakukan hal berikut:
biarkan viewController mematuhi protokol ini:
mulai amati perubahan keyboard di viewWillAppear:
berhenti mengamati perubahan keyboard di viewWillDisappear:
buat IBOutlet untuk batasan bawah dari storyboard:
(Saya sarankan memiliki semua UI Anda tertanam di dalam "contentView", dan menautkan ke properti ini kendala bawah dari contentView ini ke panduan tata letak bawah)
ubah prioritas kendala dari batasan teratas menjadi 250 (rendah)
Ini untuk membiarkan seluruh tampilan konten meluncur ke atas saat keyboard muncul. Prioritas harus lebih rendah daripada prioritas kendala lainnya dalam subview, termasuk prioritas memeluk konten / prioritas resistensi kompresi konten.
Anda mungkin harus menambahkan batasan "lebih besar dari sama" untuk ini:
Dan ini dia!
sumber
import UIKit
UIViewController
Ekstensi sederhana seperti itu dapat digunakanContoh penggunaan
Solusi Swift 4
Cepat 4.2
sumber
removeKeyboardObserver()
Metode sini tidak benar-benar menghapus pengamat. Jika Anda tidak menyebutnya, Anda akan melihatInvalid conditions for UIKeyboardWillChangeFrameNotification
di konsol dari metode add. Jika Anda memanggil ini, Anda akan melihat kesalahan yang sama, artinya pengamat tidak dihapus. Dokumentasi menyatakan "Untuk membatalkan registrasi pengamatan, Anda meneruskan objek yang dikembalikan oleh metode ini keremoveObserver(_:)
." Jadi yang Anda lakukan adalah menyimpan objek yang dikembalikan oleh metode itu, lalu meneruskannya saat Anda ingin menghapus pengamat.Anda dapat menggunakan perpustakaan ini dan hanya satu baris kode di appDidFinishedLaunching dan Anda selesai ..
IQKeyboardManager - sesuaikan tampilan setiap kali keyboard muncul tautan - https://github.com/hackiftekhar/IQKeyboardManager
sumber
Dan Terakhir karena kami menggunakan metode delegasi
refactored dari menggunakan objektif-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
sumber
var animateDistance: CGFloat!
tambah saya harus menangani UIKeyboardWillHideNotification ketika pengguna menekan tombol hide keyboard.Solusi lain yang tidak bergantung pada pembayaran otomatis, kendala, atau outlet apa pun. Apa yang Anda butuhkan adalah bidang Anda dalam scrollview.
sumber
UIKeyboardWillShowNotification
dipanggil.Ini adalah versi saya untuk solusi untuk Swift 2.2:
Daftar pertama untuk Keyboard Show / Hide Notifications
Kemudian dengan metode yang sesuai untuk pemberitahuan tersebut, gerakkan tampilan utama ke atas atau ke bawah
Caranya ada di bagian "keyboardWillShow" yang menerima panggilan setiap kali "QuickType Suggestion Bar" diperluas atau diciutkan. Kemudian kami selalu mengatur koordinat y dari tampilan utama yang sama dengan nilai negatif dari total tinggi keyboard (dengan atau tanpa bagian "QuickType bar").
Pada akhirnya jangan lupa untuk menghapus pengamat
sumber
Berikut ini adalah solusi sederhana, di mana bidang teks memiliki kendala yang mengikatnya ke panduan tata letak bawah. Ini hanya menambah ketinggian keyboard ke konstanta kendala.
sumber
Yah, saya pikir saya mungkin sudah terlambat tetapi saya menemukan versi sederhana dari jawaban Saqib. Saya menggunakan Autolayout dengan kendala. Saya memiliki tampilan kecil di dalam tampilan utama lain dengan bidang nama pengguna dan kata sandi. Alih-alih mengubah koordinat y tampilan, saya menyimpan nilai kendala asli dalam variabel dan mengubah konstanta kendala ke beberapa nilai dan lagi setelah keyboard ditolak, saya menyiapkan kendala ke yang asli. Dengan cara ini ia menghindari masalah jawaban Saqib, (Pandangan terus bergerak ke atas dan tidak berhenti). Di bawah ini adalah kode saya ...
sumber
Swift 4.x menjawab, menggabungkan jawaban dari @Joseph Lord dan @Isuru.
bottomConstraint
mewakili kendala bawah dari tampilan yang ingin Anda pindahkan.sumber
Saya telah melakukan dengan cara berikut:
Ini berguna ketika superview bidang teks dilihat
sumber
sumber
Saya telah melakukan dengan cara berikut:
sumber
Jika Anda seperti saya yang telah mencoba semua solusi di atas dan masih masalah Anda belum terpecahkan, saya punya solusi hebat untuk Anda yang bekerja seperti pesona. Pertama saya ingin mengklarifikasi beberapa hal tentang beberapa solusi yang disebutkan di atas.
sumber
Berikut ini adalah solusi umum untuk semua Langkah TextField -
1) Buat ViewController umum yang diperluas oleh ViewControllers lainnya
2) Buat ekstensi UIViewController dan TextField yang saat ini aktif
ekstensi UIViewController {func getSelectedTextField () -> UITextField? {
}
sumber
Sangat Sederhana dan tidak perlu kode lagi. Cukup tambahkan
pod 'IQKeyboardManagerSwift'
di podfile Anda, dan diAppDelegate
halaman Anda tambahkan kode di bawah ini.dan dalam
didFinishLaunchingWithOptions()
tipe metodehanya itu saja. periksa tautan video ini untuk pemahaman yang lebih baik https://youtu.be/eOM94K1ZWN8 Semoga ini bisa membantu Anda.
sumber
Kode lengkap untuk mengelola keyboard.
sumber
Saya memodifikasi solusi @Simpa sedikit .........
sumber
Tidak satu pun dari mereka yang berfungsi dan saya akhirnya menggunakan inset konten untuk meningkatkan tampilan saya ketika keyboard muncul.
catatan: Saya menggunakan UITableView
Solusi yang direferensikan @ keyboard-content-offset yang seluruhnya ditulis dalam tujuan C, solusi di bawah ini adalah Swift bersih.
Tambahkan pengamat pemberitahuan @ viewDidLoad ()
Untuk mendapatkan ukuran keyboard, pertama-tama kita mendapatkan kamus userInfo dari objek notifikasi, yang menyimpan objek tambahan apa pun yang mungkin digunakan penerima kita.
Dari kamus itu kita bisa mendapatkan objek CGRect yang menggambarkan bingkai keyboard dengan menggunakan tombol UIKeyboardFrameBeginUserInfoKey.
Terapkan inset konten untuk tampilan tabel @ metode keyboardWillBeShown,
Kembalikan metode view @ keyboardWillBeHidden
Jika Anda ingin tetap mempertimbangkan orientasi perangkat, gunakan pernyataan kondisional untuk menyesuaikan kode dengan kebutuhan Anda.
sumber
sumber
Solusi Swift 4 yang saya gunakan, memperhitungkan ukuran keyboard. Ganti
serverStatusStackView
dengan pandangan apa pun yang Anda pedulikan, misalnyaself.view
:sumber
Cara terbaik adalah menggunakan NotificationCenter untuk menangkap tindakan keyboard. Anda dapat mengikuti langkah-langkah dalam artikel singkat ini https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
sumber