Keyboard Avoidance เป็นเทคนิคการปรับอินเทอร์เฟซของแอป iOS เมื่อแป้นพิมพ์ระบบปรากณ์ ซึ่งอาจบดบังช่องข้อความและองค์ประสานอื่น ๆ ได้ หากไม่มีกลไกนี้ ผู้ใช้จะไม่เห็นสิ่งที่กำลังพิมพ์ นำไปสู่ข้อผิดพลาดและประสบการณ์ที่แย่ลงลง ตาม Apple Developer Documentation (2026) ตั้งแต่ iOS 15 เป็นต้นไป แนะนำให้ใช้ UIScrollView ควบคู่กับ UIScrollView.keyboardLayoutGuide สำหรับการจัดการเลื่อนเนื้อหาโดยอัตโนมัติ
ข้อควรรู้หลัก
Keyboard Avoidance เป็นกลุ่มเทคนิคที่ทำให้ช่องป้อนข้อมูลที่ใช้งานยังมองเห็นได้เมื่อแป้นพิมพ์ระบบปรากณ์บน iOS ปัญหาพื้นฐาน: แป้นพิมพ์ใช้พื้นที่สูงสุด 50% ของหน้าจอ และบดบังครึ่งล่างของอินเทอร์เฟซ รวมถึงช่องข้อความ ปุ่มส่ง และองค์ประสานอื่น ๆ
มีสามวิธีการหลักสำหรับการนำไปใช้: การจัดการด้วยตนผ่าน Keyboard Notifications (วิธีคลาสสิก, ทำงานตั้งแต่ iOS 3.0), การใช้ UIScrollView กับการเลื่อนอัตโนมัติ (Apple แนะนำ), และ Keyboard Layout Guide (วิธีทันสมัยกับ iOS 15+) การเลือกขึ้นอยู่กับเวอร์ชัน iOS ขั้นต่ำที่รองรับและความซับซ้อนของอินเทอร์เฟซ
ตาม Apple การขาด Keyboard Avoidance เป็นสาเหตุที่พบบ่อยที่สุดของ การปฏิเสธแอป ระหว่างการตรวจสอบหากช่องข้อความถูกปกปิดโดยแป้นพิมพ์อย่างสมบูรณ์ App Store Guidelines กำหนดอย่างชัดเจนว่าองค์ประสานที่ใช้งานได้ทั้งหมดต้องสามารถเข้าถึงได้ระหว่างการป้อนข้อมูลที่ใช้งาน
iOS ไม่สามารถกำหนดโดยอัตโนมัติได้ว่าองค์ใดควรอยู่ให้เห็นเพราะไม่รู้ความหมายของอินเทอร์เฟซ ในแบบฟอร์มง่าย ๆ ที่มีช่องข้อความหนึ่งช่อง การเลื่อนหน้าจอทั้งหมดขึ้นเท่านั้นก็พอ ในอินเทอร์เฟซที่ซับซ้อนด้วย แผงที่กำหนดเอง ปุ่มลอยตัว และหลายส่วน จำเป็นต้องใช้ตรรกะพฤติกรรมที่แตกต่างกัน
นอกจากนี้ บางแอปไม่เลื่อนเนื้อหาโดยเจตนา เช่น เครื่องคิดเลขแป้นพิมพ์หรือโปรแกรมแก้ไขที่แป้นพิมพ์เป็นส่วนหนึ่งของพื้นที่ทำงาน iOS ปล่อยให้นักพัฒนาตัดสินใจเอง โดยให้ API ที่ยืดหยุ่นสำหรับทุกสถานการณ์
UIKeyboardWillShowNotification เป็นการแจ้งเพราะหลักที่ iOS ส่งก่อนที่แป้นพิมพ์จะปรากณ์ ประกอบด้วย CGRect ที่มีตำแหน่งสุดท้ายของแป้นพิมพ์ในพจนานุกรม UIResponder.keyboardFrameEndUserInfoKey พร้อมทั้งระยะเวลาแอนิเมชันใน UIResponder.keyboardAnimationDurationUserInfoKey
ตัวจัดการแจ้งเพราะต้อง คำนวณการซ้อนกัน ระหว่างช่องข้อความที่ใช้งานและแป้นพิมพ์ จากนั้นเปลี่ยนส่วนล่าง (contentInset หรือ frame) ของคอนเทนเนอร์ หากช่องอยู่ต่ำกว่าขอบบนของแป้นพิมพ์ เนื้อหาจะเลื่อนขึ้นบนตามปริมาณการซ้อนกัน เมื่อแป้นพิมพ์ซ่อน ส่วนล่างจะกลับไปยังค่าเดิม
@objc func keyboardWillShow(_ notification: Notification) {
guard let keyboardFrame = notification
.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]
as? CGRect else { return }
let keyboardHeight = keyboardFrame.height
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
}
เมื่อใช้การแจ้งเพราะ สำคัญที่จะ จัดการแอนิเมชัน อย่างพร้อมกับแป้นพิมพ์ระบบ iOS ให้โค้งแอนิเมชัน (UIResponder.keyboardAnimationCurveUserInfoKey) และระยะเวลา ใช้ UIView.animate กับพารามิเตอร์เหล่านี้เพื่อให้เนื้อหาเลื่อนไปอย่างนุ่มนวล พร้อมกับการปรากณ์ของแป้นพิมพ์
UIScrollView.keyboardLayoutGuide เป็น API ทันสมัยสำหรับ Keyboard Avoidance ที่เปิดตัวใน iOS 15 เมื่อแป้นพิมพ์ปรากณ์ มันจะติดตามตำแหน่งของแป้นพิมพ์โดยอัตโนมัติ และอัปเดตข้อจำกัด Auto Layout ที่เชื่อมต่อส่วนล่างของอินเทอร์เฟซกับขอบบนของแป้นพิมพ์
เพื่อใช้งาน เพียงเปิดใช้ layout guide บน UIScrollView หรือ UIStackView และแนบข้อจำกัดด้านล่างของเนื้อหาไปยังมัน ไม่ต้องเรียกใช้มือแม่แต่อย่างได กับการแจ้งเพราะ การคำนวณความสูง หรือแอนิเมชัน ระบบจะทำทุกอย่างโดยอัตโนมัติ พร้อมทั้งจับคู่แอนิเมชันกับการปรากณ์และซ่อนของแป้นพิมพ์
// เปิดใช้งาน Keyboard Layout Guide (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true
// ยึดข้อจำกัดด้านล่างไปยังส่วนบนของแป้นพิมพ์
contentView.bottomAnchor.constraint(
equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true
followsUndockedKeyboard เป็นคุณสมบัติที่กำหนดว่าไกด์ควรตอบสนองต่อแป้นพิมพ์ที่สามารถแยกออกจากขอบล่าง (บน iPad) หรือไม่ ตั้งค่าเป็น true เมื่ออินเทอร์เฟซ ทำงานได้อย่างถูกต้อง กับแป้นพิมพ์ลอยตัว สำหรับ iPhone คุณสมบัตินี้จะถูกละเว้ย — แป้นพิมพ์จะติดอยู่กับขอบล่างเสมอ
UIScrollView เป็นคอนเทนเนอร์ที่ Apple แนะนำให้ใช้เป็นพื้นฐานสำหรับ Keyboard Avoidance เมื่อแป้นพิมพ์ปรากณ์ scroll view จะเพิ่ม contentInset.bottom ของมัน ทำให้สามารถเลื่อนเนื้อหาขึ้นบนและทำให้ช่องที่ใช้งานมองเห็นได้
มีธรรมสำคัญคือ scrollRectToVisible ซึ่งเลื่อน scroll view โดยโปรแกรมเพื่อให้สี่เหลี่ยมมุมที่ระบุ (ช่องข้อความที่ใช้งาน) อยู่ในบริเวณที่มองเห็น การรวมการเปลี่ยน contentInset กับการเรียก scrollRectToVisible ช่วยให้แน่ใจว่าช่องไม่เพียงจะเปิดเผย แต่ยังอยู่ในส่วนบนของบริเวณที่มองเห็น
func adjustScrollForKeyboard(
keyboardHeight: CGFloat,
activeField: UIView
) {
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
var visibleRect = view.frame
visibleRect.size.height -= keyboardHeight
if activeField.frame.origin.y > visibleRect.maxY {
scrollView.scrollRectToVisible(
activeField.frame, animated: true
)
}
}
สำหรับ UIViewController กับ UITableView Apple แนะนำให้ใช้ UITableViewController ซึ่งจะปรับ contentInset โดยอัตโนมัติเมื่อแป้นพิมพ์ปรากณ์ หากคุณใช้ UIViewController กับตารางที่เพิ่มเข้าไป คุณจะต้องใช้ Keyboard Avoidance ด้วยตนเอง — UITableViewController ไม่ให้พฤติกรรมนี้สำหรับคอนโทรลเลอร์ที่กำหนดเอง
Auto Layout ช่วยให้สามารถใช้ Keyboard Avoidance โดยไม่ต้องเขียนโปรแกรมแอนิเมชัน — เพียงเปลี่ยนกิจกรรม (isActive) ของข้อจำกัดใดๆ หนึ่ง หรืออัปเดตค่าคงที่ของมันในการตอบสนองต่อการแจ้งเพราะแป้นพิมพ์
แผนงานทั่วไป: สร้าง IBOutlet NSLayoutConstraint สำหรับส่วนล่างของ scroll view หรือเนื้อหา และในตัวจัดการ keyboardWillShow ตั้ง constraint.constant = keyboardHeight และใน keyboardWillHide ตั้งกลับเป็น 0 อัปเดตเนื้อนแผนผังผ่าน layoutIfNeeded ภายในบล็อก animate เพื่อการเปลี่ยนแปลงที่นุ่มนวล
| วิธีการ | เวอร์ชัน iOS | ความซับซ้อน | คำแนะนำ |
|---|---|---|---|
| Keyboard Notifications | iOS 3.0+ | ปานกลาง | สำหรับรองรับเวอร์ชันเก่า |
| UIScrollView + contentInset | iOS 2.0+ | ต่ำ | วิธีสากล, Apple แนะนำ |
| Keyboard Layout Guide | iOS 15+ | น้อยที่สุด | วิธีทันสมัย (iOS 15+) |
| IQKeyboardManager | iOS 8.0+ | ศูนย์ | แก้ไขปัญหาด่วน, ไลบรารียอดนิยม |
เมื่อใช้ UIStackView การเปลี่ยนข้อจำกัดส่วนล่างก็ใช้ได้: stack view จะแจกจำหน่ายองค์ประกอบย่อยโดยอัตโนมัติ อย่างไรก็ตาม หาก stack view อยู่ภายใน UIScrollView ควรจัดการ contentInset ของ scroll view เอง มากกว่าข้อจำกัดภายในนั้น
IQKeyboardManager เป็นไลบรารียอดนิยมที่สุด (มากกว่า 16,000 ดาวบน GitHub) ซึ่งใช้ Keyboard Avoidance อัตโนมัติโดยไม่ต้องเขียนโค้ดแม้เพียงบรรทัดดียวในตัวควบคุม โดยใช้ method swizzling เพื่อติดตามช่องข้อความ และเลื่อนเนื้อหาโดยอัตโนมัติเมื่อแป้นพิมพ์ปรากณ์
ไลบรารีให้การตั้งค่าที่ยืดหยุ่น: คุณสามารถระบุระยะห่างระหว่างช่องและแป้นพิมพ์ เปิด/ปิดสำหรับคอนโทรลเลอร์เฉพาะเจาะจง และกำหนดพฤติกรรมสำหรับ UITextView และมุมมองป้อนที่กำหนดเอง อย่างไรก็ตาม method swizzling อาจขัดแย้งกับไลบรารีอื่น และ Apple ไม่แนะนำวิธีนี้สำหรับโค้ดผลิตเนื่องจากผลกระทบข้างค์งไม่สามารถคาดเดาได้
ทางเลือกรวมถึง TPKeyboardAvoiding (ไลบรารีน้ำหนักเบา, ~2,000 ดาว) และ KeyboardManager จากชุมชน สำหรับโปรเจกต์ทันสมัย Apple แนะนำให้ใช้เครื่องมือในตัว iOS 15+ และสำหรับโปรเจกต์ที่มีเวอร์ชันต่ำกว่า — UIScrollView กับ contentInset ซึ่งเป็นโซลูชันที่เชื่อถือได้มากที่สุดในตัว
คำถามที่พบบ่อย
Keyboard Avoidance เป็นเทคนิคการเลื่อนอินเทอร์เฟซเมื่อแป้นพิมพ์ปรากณ์ เพื่อให้ช่องข้อความที่ใช้งานยังมองเห็น ใช้งานผ่าน UIScrollView, Keyboard Notifications หรือ Keyboard Layout Guide iOS 15+ สำหรับการปรับแผนผังโดยอัตโนมัติ
คุณสามารถเปลี่ยน frame ของมุมมองหลักเมื่อแป้นพิมพ์ปรากณ์ โดยลดความสูงลงตามความสูงของแป้นพิมพ์ ใช้ UIKeyboardWillShowNotification และ UIKeyboardWillHideNotification เพื่ออัปเดต frame ในบล็อกแอนิเมชันด้วยพารามิเตอร์จาก userInfo ของการแจ้งเพราะ
keyboardLayoutGuide เป็น UILayoutGuide ที่เพิ่มใน UIScrollView (iOS 15+) โดยติดตามขอบบนของแป้นพิมพ์โดยอัตโนมัติ และอัปเดต NSLayoutConstraint ของมันเมื่อแป้นพิมพ์ปรากณ์และซ่อน พร้อมทั้งจับคู่แอนิเมชันกับแป้นพิมพ์ระบบ
IQKeyboardManager เป็นที่นิยมที่สุด ไม่ต้องใช้โค้ด TPKeyboardAvoiding เป็นทางเลือกที่มีน้ำหนักเบา สำหรับโปรเจกต์ใหม่ ควรใช้เครื่องมือในตัว iOS 15+ เพราะไลบรารีบุคคลที่สามใช้ method swizzling ซึ่ง Apple ไม่แนะนำ
หากคุณใช้ IQKeyboardManager ให้เรียก enabled = false สำหรับ UIViewController เฉพาะเจาะจง สำหรับการใช้งานด้วยตนเอง เพียงไม่ต้องสมัครรับการแจ้งเพราะแป้นพิมพ์บนหน้าจอนั้น หรือตั้ง contentInset เป็นศูนย์เมื่อแป้นพิมพ์ปรากณ์
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม