หนึ่งในคำตอบที่ได้รับความนิยมในหัวข้อนี้ใช้รหัสต่อไปนี้:
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
มีปัญหาที่ชัดเจนเกี่ยวกับการชดเชยมุมมองของคุณด้วยจำนวนคงที่ มันจะดูดีในอุปกรณ์หนึ่ง แต่จะดูไม่ดีกับการกำหนดค่าขนาดอื่น คุณจะต้องได้รับความสูงของแป้นพิมพ์และใช้เป็นค่าชดเชยของคุณ
นี่คือวิธีการแก้ปัญหาที่ทำงานบนอุปกรณ์ทั้งหมดและจัดการกับตัวพิมพ์เล็ก - ใหญ่ที่ผู้ใช้ซ่อนฟิลด์ข้อความคาดเดาขณะพิมพ์
สารละลาย
สิ่งสำคัญที่ควรทราบด้านล่างนี้คือสิ่งที่เรากำลังส่งผ่าน self.view.window เป็นพารามิเตอร์วัตถุของเรา สิ่งนี้จะให้ข้อมูลจากคีย์บอร์ดของเราเช่นความสูงของมัน!
@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
}
เราจะทำให้มันดูดีในทุกอุปกรณ์และจัดการกับกรณีที่ผู้ใช้เพิ่มหรือลบฟิลด์ข้อความคาดการณ์
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
})
}
}
ลบผู้สังเกตการณ์
อย่าลืมลบผู้สังเกตการณ์ก่อนที่จะออกจากมุมมองเพื่อป้องกันไม่ให้มีการส่งข้อความที่ไม่จำเป็น
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)
}
อัปเดตตามคำถามจากความคิดเห็น:
หากคุณมีฟิลด์ข้อความอย่างน้อยสองฟิลด์คุณสามารถตรวจสอบเพื่อดูว่า view.frame.origin.y ของคุณอยู่ที่ศูนย์หรือไม่
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)
}