Một trong những câu trả lời phổ biến về chủ đề này sử dụng đoạn mã sau:
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Có một vấn đề rõ ràng với việc bù đắp tầm nhìn của bạn bằng một lượng tĩnh. Nó sẽ trông đẹp trên một thiết bị nhưng sẽ trông tệ trên mọi cấu hình kích thước khác. Bạn sẽ cần lấy chiều cao bàn phím và sử dụng giá trị đó làm giá trị bù của mình.
Đây là một giải pháp hoạt động trên tất cả các thiết bị và xử lý trường hợp cạnh trong đó người dùng ẩn trường văn bản dự đoán trong khi nhập.
Giải pháp
Điều quan trọng cần lưu ý dưới đây, chúng tôi sẽ chuyển self.view.window thành tham số đối tượng của chúng tôi. Điều này sẽ cung cấp cho chúng tôi dữ liệu từ Bàn phím của chúng tôi, chẳng hạn như chiều cao của nó!
@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
}
Chúng tôi sẽ làm cho nó trông đẹp hơn trên tất cả các thiết bị và xử lý trường hợp người dùng thêm hoặc xóa trường văn bản dự đoán.
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
})
}
}
Xóa quan sát
Đừng quên xóa người quan sát của bạn trước khi bạn rời khỏi chế độ xem để ngăn các tin nhắn không cần thiết được truyền đi.
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)
}
Cập nhật dựa trên câu hỏi từ ý kiến:
Nếu bạn có hai hoặc nhiều trường văn bản, bạn có thể kiểm tra xem view.frame.origin.y của bạn có bằng không.
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)
}