使用inputAccessoryView的Swift问题

时间:2016-12-03 18:01:19

标签: ios swift swift3

我有一个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发生的事情。

我一直在努力让自己的工作方式好几天。任何人都可以向我解释为什么它不能像我想要的那样工作以及我如何解决它?

提前多多感谢!

1 个答案:

答案 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)
}