在保持返回功能的同时使键盘远离UITextView

时间:2016-12-14 09:01:42

标签: ios swift keyboard swift3 uitextview

当你按下返回键时,有很多答案可以让键盘消失,但我希望返回键的功能仍然存在,这样用户可以创建新的行,但我还需要一种方法来关闭键盘。

我考虑过的一些事情是关闭键盘的手势识别器,但这可能不直观。这里的想法和最佳实践表示赞赏。

请在回答之前注意我已经有一个手势识别器,如果用户在UITextView外面点击以关闭任何键盘,但是这个特定的UITextView会占用整个屏幕,因此点击它并不起作用。

我目前使用的代码来自另一篇帖子,如下所示。

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}

我所要做的就是在我的viewcontroller中调用此函数,我希望tap可以从任何文本控件中随意关闭键盘。它到目前为止工作得非常好,但是点击控件本身仍然会产生键盘不会消失的问题。

为占据全屏的UITextView关闭键盘的最佳方法是什么?

3 个答案:

答案 0 :(得分:7)

我建议您在键盘上方添加“Done”按钮。有很多教程如何做到这一点,没有理由复制SO答案,只需检查:How to add a 'Done' button to numpad keyboard in iOS

可能的解决方案

extension UITextView {

    func addDoneButton() {
        let keyboardToolbar = UIToolbar()
        keyboardToolbar.sizeToFit()
        let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                                            target: nil, action: nil)
        let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done,
                                            target: self, action: #selector(UIView.endEditing(_:)))
        keyboardToolbar.items = [flexBarButton, doneBarButton]
        self.inputAccessoryView = keyboardToolbar
    }
}

要使用它,只需从现在开始在任何UITextView上调用addDoneButton。

答案 1 :(得分:1)

在视图控制器中添加此方法。

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

除此之外,这应该可以解决问题 ** 在键盘外部或文本视图中轻按键盘

*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}

答案 2 :(得分:0)

因此,基于此处的其他一些答案,我为UITextView建立了以下子类,该子类具有与接口-生成器兼容的字段以启用多行 Return 功能,和完成功能。

希望有帮助。

Swift v5

import UIKit
@IBDesignable class MultiLineTextView: UITextView {

    @IBInspectable var multiLineWithDoneButton: Bool = false

    override func didMoveToWindow() {
        super.didMoveToWindow()
        if multiLineWithDoneButton { // Add a toolbar with a done button to the keyboard, if required
            returnKeyType = UIReturnKeyType.default
            let toolbar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0,  width: Int(self.frame.size.width), height: 45))
            let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let doneButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(doneButtonPressed))
            toolbar.setItems([flexibleSpace, doneButton], animated: false)
            toolbar.sizeToFit()
            inputAccessoryView = toolbar
        } else {
            returnKeyType = UIReturnKeyType.done
        }
    }

    @objc private func doneButtonPressed() {
        endEditing(true)
    }
}