如果我们的 UITextView 几乎占满了整个屏幕,那么当键盘出现的时候就会遮挡位于底部的内容。通常,解决方案有两种:
- 当键盘出现时,在文字的底部流出足够的空行,以显示键盘
- 当键盘出现时,压缩 textView 的高度以容纳底部的键盘
第一种方式受到文字大小的限制,而且需要额外的空间,还有可能找不到光标的位置。所以我们介绍相对来讲更为精髓的第二种方式:
第一步:添加委托
使 UITextView 所在的 UIViewController 遵从 UITextViewDelegate 协议。虽然用 extension 的方法更为推荐,这里为了直观直接在类名后边设置。
class MyViewController: UIViewController, UITextViewDelegate {
}
为 textView 指定委托为当前的 UIViewController:
textView.delegate = self
第二步:实现协议中的监听方法
键盘的高度是 216,所以把 textView 的高度减去216。
当开始进行编辑的时候,textViewDidBeginEditing()
方法会被执行。
func textViewDidBeginEditing(textView: UITextView) {
// 获取压缩后的高度
let h = view.frame.height - 216
// 定义一个新的矩形,具有压缩后的高度
let rect = CGRect(origin: textView.frame.origin, size: CGSize(width: textView.frame.width, height: h))
// 赋值给 textView
textView.frame = rect
}
下面的代码让 textView 在滚动的时候隐藏,并且恢复 textView 原来的高度。scrollViewWillBeginDragging()
方法会在 textView 刚被滑动且手没离开的时候执行。
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
textView.resignFirstResponder()
textView.frame = view.frame
}
以上代码中,textView 的 resignFirstResponder()
方法会使 textView 丧失第一响应者的身份,从而不具有键盘的使用权。
如此这般,便可以防止键盘遮挡内容了。