Не уверен, правильно ли я понимаю, что означает не быть прямым потомком. Но 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