Hướng dẫn bố cục khu vực an toàn mới được giới thiệu trong iOS 11 hoạt động tuyệt vời để ngăn nội dung hiển thị bên dưới thanh nhưng không bao gồm bàn phím. Điều đó có nghĩa là khi bàn phím được hiển thị, nội dung vẫn bị ẩn đằng sau nó và đây là vấn đề tôi đang cố giải quyết.Mở rộng Khu vực an toàn cho iOS 11 để bao gồm bàn phím
Cách tiếp cận của tôi dựa trên việc nghe thông báo bàn phím và sau đó điều chỉnh khu vực an toàn thông qua additionalSafeAreaInsets
.
Đây là mã của tôi:
override func viewDidLoad() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
}
//MARK: - Keyboard
extension MyViewController {
@objc func keyboardWillShow(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillHide(notification: NSNotification) {
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillChange(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
}
này hoạt động tốt như MyController
là một UIViewController
với một UITableView
mà kéo dài qua toàn bộ khu vực an toàn. Bây giờ khi bàn phím xuất hiện, phần dưới được đẩy lên sao cho không có ô nào nằm phía sau bàn phím.
Vấn đề là với thanh đáy. Tôi cũng có một thanh công cụ ở phía dưới đã được bao gồm trong khu vực an toàn. Vì vậy, thiết lập chiều cao bàn phím đầy đủ như chèn thêm khu vực an toàn đẩy dưới cùng của bảng xem lên quá nhiều bởi chính xác chiều cao của thanh dưới cùng. Để phương pháp này hoạt động tốt, tôi phải đặt additionalSafeAreaInsets.bottom
bằng với chiều cao bàn phím trừ đi độ cao của thanh dưới cùng.
Câu hỏi 1: Cách tốt nhất để có khoảng cách khu vực an toàn hiện tại ở dưới cùng là gì? Thủ công có được khung thanh công cụ và sử dụng chiều cao của nó? Hoặc có thể lấy khoảng cách trực tiếp từ hướng dẫn bố trí khu vực an toàn không?
Câu hỏi 2: Có lẽ nó có thể cho thanh dưới cùng thay đổi kích thước mà không có kích thước bàn phím thay đổi vì vậy tôi cũng nên thực hiện một số phương pháp nghe thay đổi trong khung của thanh. Điều này có được thực hiện tốt nhất trong viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
không? Hoặc ở nơi khác?
Cảm ơn bạn
Đó là giải pháp tốt hơn để đối phó với iPhoneX, vì chiều cao của nó bao gồm bên ngoài khu vực an toàn –
... nhưng tiếc là nó sử dụng safeAreaLayoutGuide, chỉ có iOS11 và tôi cần hỗ trợ lại cho iOS9 –
Bạn không gặp bất kỳ sự cố nào với điều này và iPhone X phải không? Vị trí Y của bàn phím, khi được hiển thị trên iPhone X, có vẻ hơi quá cao so với màn hình thực tế. – Jonny