Как изменить размер элемента UIView, когда UITableView ниже прокручивается вверх - PullRequest
0 голосов
/ 16 апреля 2019

Почти (верхняя) половина экрана - 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 изменяет размер больше, чем я прокручивал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...