Salah satu jawaban populer di utas ini menggunakan kode berikut:
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Ada masalah nyata dengan mengimbangi tampilan Anda dengan jumlah statis. Ini akan terlihat bagus pada satu perangkat tetapi akan terlihat buruk pada konfigurasi ukuran lainnya. Anda harus mendapatkan ketinggian keyboard dan menggunakannya sebagai nilai offset Anda.
Berikut adalah solusi yang berfungsi di semua perangkat dan menangani kasus tepi di mana pengguna menyembunyikan bidang teks prediktif saat mengetik.
Larutan
Penting untuk dicatat di bawah ini, kami meneruskan self.view.window sebagai parameter objek kami. Ini akan memberi kami data dari Keyboard kami, seperti tingginya!
@IBOutlet weak var messageField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: self.view.window)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: self.view.window)
}
func keyboardWillHide(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
self.view.frame.origin.y += keyboardSize.height
}
Kami akan membuatnya terlihat bagus di semua perangkat dan menangani kasus di mana pengguna menambahkan atau menghapus bidang teks prediktif.
func keyboardWillShow(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size
if keyboardSize.height == offset.height {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y -= keyboardSize.height
})
} else {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y += keyboardSize.height - offset.height
})
}
}
Hapus Pengamat
Jangan lupa untuk menghapus pengamat Anda sebelum meninggalkan tampilan untuk mencegah pengiriman pesan yang tidak perlu.
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)
}
Pembaruan berdasarkan pertanyaan dari komentar:
Jika Anda memiliki dua atau lebih bidang teks, Anda dapat memeriksa untuk melihat apakah view.frame.origin.y Anda nol.
func keyboardWillShow(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size
if keyboardSize.height == offset.height {
if self.view.frame.origin.y == 0 {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y -= keyboardSize.height
})
}
} else {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y += keyboardSize.height - offset.height
})
}
print(self.view.frame.origin.y)
}