Почти (верхняя) половина экрана - UIView, остальная часть - UITableView. Мне нужно уменьшить размер UIView в соответствии с тем, насколько прокручивается прокрутка вверх, до минимума x, и когда я прокручиваю вниз, где бы я ни находилась в табличном представлении, чтобы он увеличивался в размере в зависимости от того, сколько прокручиваю до максимума y. Проблема в том, что я не могу сделать это плавно, он либо слишком быстро изменяет размер, либо слишком медленно, либо мгновенно.
Я пробовал несколько решений, которые нашел в Интернете, но все они делают переход либо радикальным, либо не синхронным с тем, что пользователь прокручивает. Моя последняя попытка почти у меня получилась, но она прокручивалась экспоненциально быстрее, не в зависимости от того, как двигался мой палец, поэтому содержимое таблицы «скользило» мимо моего пальца.
Мои делегированные функции прокрутки (которые прокручиваются внезапно):
var lastContentOffset: CGFloat = 0
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.lastContentOffset = scrollView.contentOffset.y
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.view.endEditing(true)
//if user is scrolling up (content going up)
if (self.lastContentOffset < scrollView.contentOffset.y) {
//reduce the top UIView size
self.todoHeight.constant = CGFloat(36)
self.topViewHeight.constant = CGFloat(93)
//if user is scrolling down (content going down)
} else if (self.lastContentOffset > scrollView.contentOffset.y) {
//increase the top UIView size
self.collectionView.reloadData()
self.todoHeight.constant = CGFloat(206)
self.topViewHeight.constant = CGFloat(263)
}
}
В моей последней попытке, когда я почти все понял, я использовал следующую логику для изменения размера своего контента, который, как я думал, будет работать, но он прокручивался экспоненциально быстрее, чем мой палец (контент прокручивался мимо моего пальца):
var lastContentOffset: CGFloat = 0
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.lastContentOffset = scrollView.contentOffset.y
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.view.endEditing(true)
if (self.lastContentOffset < scrollView.contentOffset.y) {
self.todoHeight.constant = self.todoHeight.constant - (scrollView.contentOffset.y - lastContentOffset)
self.topViewHeight.constant = self.topViewHeight.constant - (scrollView.contentOffset.y - lastContentOffset)
if (self.todoHeight.constant < 36 || self.topViewHeight.constant < 93){
self.todoHeight.constant = CGFloat(36)
self.topViewHeight.constant = CGFloat(93)
}
} else if (self.lastContentOffset > scrollView.contentOffset.y) {
self.collectionView.reloadData()
self.todoHeight.constant = self.todoHeight.constant + (scrollView.contentOffset.y - lastContentOffset)
self.topViewHeight.constant = self.topViewHeight.constant + (scrollView.contentOffset.y - lastContentOffset)
if (self.todoHeight.constant > 206 || self.topViewHeight.constant > 263){
self.todoHeight.constant = CGFloat(206)
self.topViewHeight.constant = CGFloat(263)
}
}
}
Я ожидал, что содержимое UITableView прокрутится пальцем. Вместо этого я заставляю его скользить быстрее, потому что UIView изменяет размер мгновенно, или он скользит быстрее, чем мой палец, потому что UIView изменяет размер больше, чем я прокручивал.