Fix weird search bar text field autoscrolling

This commit is contained in:
Ilya Laktyushin 2020-09-29 04:22:34 +04:00
parent 8b362c60f4
commit 7fb0b48ded

View File

@ -255,9 +255,10 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate {
strongSelf.selectedTokenIndex = i strongSelf.selectedTokenIndex = i
if !strongSelf.isFirstResponder { if !strongSelf.isFirstResponder {
let _ = strongSelf.becomeFirstResponder() let _ = strongSelf.becomeFirstResponder()
} else {
let newPosition = strongSelf.beginningOfDocument
strongSelf.selectedTextRange = strongSelf.textRange(from: newPosition, to: newPosition)
} }
let newPosition = strongSelf.beginningOfDocument
strongSelf.selectedTextRange = strongSelf.textRange(from: newPosition, to: newPosition)
} }
} }
let isSelected = i == self.selectedTokenIndex let isSelected = i == self.selectedTokenIndex
@ -358,7 +359,9 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate {
self.tokenContainerNode.frame = CGRect(origin: self.tokenContainerNode.frame.origin, size: CGSize(width: self.tokensWidth, height: self.bounds.height)) self.tokenContainerNode.frame = CGRect(origin: self.tokenContainerNode.frame.origin, size: CGSize(width: self.tokensWidth, height: self.bounds.height))
if let scrollView = self.scrollView { if let scrollView = self.scrollView {
scrollView.contentInset = UIEdgeInsets(top: 0.0, left: leftOffset, bottom: 0.0, right: 0.0) if scrollView.contentInset.left != leftOffset {
scrollView.contentInset = UIEdgeInsets(top: 0.0, left: leftOffset, bottom: 0.0, right: 0.0)
}
if leftOffset.isZero { if leftOffset.isZero {
scrollView.contentOffset = CGPoint() scrollView.contentOffset = CGPoint()
} else if self.tokensWidth != previousTokensWidth { } else if self.tokensWidth != previousTokensWidth {
@ -441,14 +444,22 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate {
return nil return nil
} }
var fixAutoScroll: CGPoint?
func scrollViewDidScroll(_ scrollView: UIScrollView) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.updateTokenContainerPosition() if let fixAutoScroll = self.fixAutoScroll {
self.scrollView?.setContentOffset(fixAutoScroll, animated: true)
self.scrollView?.setContentOffset(fixAutoScroll, animated: false)
self.fixAutoScroll = nil
} else {
self.updateTokenContainerPosition()
}
} }
override func becomeFirstResponder() -> Bool { override func becomeFirstResponder() -> Bool {
if let contentOffset = self.scrollView?.contentOffset { if let contentOffset = self.scrollView?.contentOffset {
Queue.mainQueue().after(0.03) { self.fixAutoScroll = contentOffset
self.scrollView?.setContentOffset(contentOffset, animated: true) Queue.mainQueue().after(0.1) {
self.fixAutoScroll = nil
} }
} }
return super.becomeFirstResponder() return super.becomeFirstResponder()