Прокрутить родительский вид прокрутки, когда дочерний вид прокрутки достигает конца

У меня есть дочерний вид прокрутки, содержащийся в родительском представлении прокрутки (не прямой дочерний элемент). Я хочу, чтобы родительское представление прокрутки начинало прокручиваться в том же направлении, как только дочернее представление прокрутки достигает конца своего содержимого.

Этот вид работает из коробки, но не совсем. Прямо сейчас мне нужно поднять палец, чтобы родительский вид прокрутки начал прокручиваться после того, как дочерний элемент достиг конца.

Есть мысли по этому поводу?

ИЗМЕНИТЬ:

Пример того, что я ищу, можно увидеть в Snapchat, проведя вправо в ячейке представления таблицы, чтобы открыть контроллер чата.


person oyvindhauge    schedule 12.09.2015    source источник
comment
Вот отличный пример репозитория для этой задачи: github.com/goktugyil/EZSwipeController.   -  person Esqarrouth    schedule 19.11.2015


Ответы (1)


Не уверен, правильно ли я понимаю, что означает не быть прямым потомком. Но iOS должна сделать это автоматически, как только вы дойдете до конца прокрутки дочернего представления, она должна позволить вам прокручивать родительскую прокрутку.

Для этого нужно реализовать для дочернего элемента:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:   (BOOL)decelerate{
   scrollView.bounces = NO;
}

scrollView.bounces = NO не позволяет scrollView вернуться к концу прокрутки. Так что это просто придерживаться того положения, в котором он перестает прокручиваться.

Затем вам нужно вызвать родительскую прокрутку из метода scrollViewDidScroll для дочернего элемента.

Что-то подобное:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        CGFloat scrollViewHeight = scrollView.frame.size.height;
        CGFloat scrollContentSizeHeight = scrollView.contentSize.height;
        CGFloat scrollOffset = scrollView.contentOffset.y;

        CGFloat offset = scrollContentSizeHeight - (scrollOffset + scrollViewHeight);
        if (offset <= 0)
            [self.parentView setContentOffset:CGPointMake(self.parentView.contentOffset.x,  self.parentView.contentOffset.y + diffOffset) animated:YES];
}

Где diffOffset - это расстояние, на которое вы хотите прокрутить parentScroll.

Вы можете предпочесть более продвинутый обходной путь.

Например, вы можете реализовать

scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

чтобы вы знали, что такое velocity прокрутки, сравнение targetContentOffset с scrollContentSizeHeight и scrollViewHeight должно дать вам знать, что этот конкретный свиток вот-вот закончится, перетаскивание достигает конца содержимого прокрутки.

И вы можете вычислить diffOffset и animationTime более точно.

Было бы неплохо заблокировать прокрутку для дочернего вида, когда он не полностью виден в родительской прокрутке, поэтому возможность прокрутки появляется только при прокрутке вверх до определенной позиции.

person teamnorge    schedule 12.09.2015
comment
Спасибо за ответ, обязательно попробую ваше решение. - person oyvindhauge; 14.09.2015
comment
На всякий случай я создал простой тестовый проект, в котором поместил две UITableView вертикально внутри UIScrollView, и это сработало. Могу поставить куда-нибудь, если нужно. - person teamnorge; 14.09.2015