Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> iOS

Cách ẩn bàn phím ảo trên iOS khi chạm ra ngoài

Để ẩn bàn phím trên màn hình, iOS SDK cung cấp các phương thức nội bộ. Bàn phím xuất hiện khi người dùng nhập liệu vào UITextField hoặc UITextView. Chúng ta cần dùng các phương thức phù hợp.

Cách 1: Ẩn bàn phím cho một Text Field cụ thể

Nếu text field hiện tại là tfOne:

tfOne.resignFirstResponder()

Gọi phương thức này trong action của button hoặc gesture recognizer.

Cách 2: Hàm chung cho nhiều Text Field/View (Khuyến nghị)

Tạo hàm extension cho UIViewController để ẩn bàn phím khi chạm ra ngoài vùng nhập liệu:

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
    
    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

Cách sử dụng

Gọi trong viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    hideKeyboardWhenTappedAround()
}

Khi đó, chạm bất kỳ đâu trên view (trừ text field/view) sẽ ẩn bàn phím.

Cách 3: Sử dụng UITextFieldDelegate (Cho trường hợp cần kiểm soát chi tiết)

class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }
    
    // Ẩn bàn phím khi nhấn Return
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

Cách 4: Ẩn bàn phím khi scroll (UITableView/UICollectionView)

tableView.keyboardDismissMode = .onDrag // hoặc .interactive

Tóm tắt so sánh

Phương pháp Ưu điểm Nhược điểm
resignFirstResponder() Đơn giản, kiểm soát chính xác Phải tham chiếu đến từng text field
Extension UIViewController Tái sử dụng, tự động cho toàn màn hình Cần view để gắn gesture
UITextFieldDelegate Kiểm soát phím Return, validation Phải set delegate cho từng field
keyboardDismissMode Tự động khi scroll table/collection Chỉ áp dụng cho scroll view

Lưu ý

  • cancelsTouchesInView = false đảm bảo touch vẫn được truyền xuống các view con
  • view.endEditing(true) ẩn bàn phím cho tất cả text field/text view trong view hierarchy
  • Trên iPad, bàn phím có thể tách (split) - code trên vẫn hoạt động bình thường