我正在尝试使用下面的代码在键盘隐藏时移动TextView。
override func viewDidLoad() {
super.viewDidLoad()
registerForKeyboardNotifiactions()
tableView.delegate = self
tableView.dataSource = self
tableView.estimatedRowHeight = 40
tableView.rowHeight = UITableViewAutomaticDimension
}
var textsView = UITextView()
func registerForKeyboardNotifiactions(){
let ncUp = NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)
var ncDown = NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWasShown(aNotification: NSNotification) {
let info = aNotification.userInfo!
let kbSize = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size
let contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0)
tableView.contentInset = contentInsets
tableView.scrollIndicatorInsets = contentInsets
var aRect = self.view.frame
aRect.size.height -= kbSize.height
if !CGRectContainsPoint(aRect, textsField.frame.origin) {
self.tableView.scrollRectToVisible(textsField.frame , animated: true)
}
else if !CGRectContainsPoint(aRect, textsView.frame.origin) {
self.tableView.scrollRectToVisible(textsView.frame , animated: true)
}
}
func keyboardWillBeHidden(aNotifiacation: NSNotification){
let contentInsets = UIEdgeInsetsZero
tableView.contentInset = contentInsets
tableView.scrollIndicatorInsets = contentInsets
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cells = tableView.dequeueReusableCellWithIdentifier("CommentCell", forIndexPath: indexPath) as! MakeCommentCell
self.textsView = cells.textView
cells.textView.delegate = self
textsField = cells.textField return cells
}
它可以与TextField一起使用,但是在TextView的情况下它不起作用。我尝试了许多改变底部限制和其他建议的东西,我可以在Stack OverFlow和其他网站找到但似乎没有一个对我有效(我可能没有清楚地理解它)。
我怎么能让它发挥作用?
如果有更好的方式我很想知道它。
谢谢
答案 0 :(得分:0)
我认为代码中检查textField / textViews框架是否被键盘覆盖的部分有问题。
在比较CGGeometry结构之前,您应该确保它们来自相同的坐标空间。 textView的frame属性在它的superview的坐标空间上,我知道是表格单元格的contentView。您可能不应该直接将它与view.frame进行比较,而w / c位于view.superview的坐标空间。
UIView和UICoordinateSpace有转换这些结构的方法。
无论如何,这是我将如何进行检查:
let keyboardFrame = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()//the keyboard end frame on the coordinate space of the app's window
let textViewFrame = textView.convertRect(textView.bounds, toView: nil)//the textView frame on the coordinate space of the app's window
if CGRectIntersectsRect(keyboardFrame, textViewFrame) {
let textViewFrame = textView.convertRect(textView.bounds, toView:self.tableView) //textView frame on the coord space of tableView
self.tableView.scrollRectToVisible(textViewFrame , animated: true)
}