我有一个tableView
,其中包含自定义inputAccessoryView
,我tableView.keyboardDismissMode
设置为.interactive
。我将UIView
子类化,我将此类创建为自定义inputAccessoryView
。
视图中有一个textView
,我会自动调整大小,直到达到一定数量的行。这是我的代码:
override var intrinsicContentSize: CGSize {
DispatchQueue.main.async {
let path = IndexPath(row: self.tableView.numberOfRows(inSection: 0) - 1, section: 0)
self.tableView.scrollToRow(at: path, at: .bottom, animated: true)
}
sendButton.frame.origin.y = self.frame.maxY - 5 - sendButton.frame.height
return CGSize(width: self.bounds.width, height: (textView.numberOfLines() < 10 ? textView.text.sizeForWidth(width: textView.frame.width, font: textView.font!).height : 254) + textView.frame.origin.y * 2)
}
func textViewDidChange(_ textView: UITextView) {
placeholderLabel.isHidden = !textView.text.isEmpty
if textView.numberOfLines() < 10 { // I defined numberOfLines() elsewhere
textView.isScrollEnabled = false
} else {
textView.isScrollEnabled = true
}
invalidateIntrinsicContentSize()
}
.async {}
阻止用于在tableView
高度增加后再次滚动到inputAccessoryView
的底部。
我的问题是,当我向下拖动tableView
以隐藏键盘时,tableView
会在我不想要的时候运行滚动动画(async
块中的那个)它滚动到底部。以下是a video发生的事情。
我一直在努力让自己的工作方式好几天。任何人都可以向我解释为什么它不能像我想要的那样工作以及我如何解决它?
提前多多感谢!
答案 0 :(得分:2)
我解决了自己的问题!万岁!
为此,我在ViewController
中创建了一个公共值,如果当前正在拖动/滚动tableView
。我使用UIScrollView
委托方法来设置当前是否正在滚动tableView
:
scrollViewWillBeginDragging(_:)
and
scrollViewDidEndDragging(_:)
然后我将intrinsicContentSize
更改为:
override var intrinsicContentSize: CGSize {
if viewController.isDragging == false && textView.isFirstResponder {
DispatchQueue.main.async {
let path = IndexPath(row: self.tableView.numberOfRows(inSection: 0) - 1, section: 0)
self.tableView.scrollToRow(at: path, at: .bottom, animated: true)
}
}
sendButton.frame.origin.y = self.frame.maxY - 5 - sendButton.frame.height
return CGSize(width: self.bounds.width, height: (textView.numberOfLines() < 10 ? textView.text.sizeForWidth(width: textView.frame.width, font: textView.font!).height : 254) + textView.frame.origin.y * 2)
}