问题描述
如何让两个滚动视图跟随彼此滚动?
How would I make two scroll views follow each others scrolling?
例如,我在屏幕左侧有一个滚动视图 (A),其内容可以上下滚动,但不能左右滚动.滚动视图 B 匹配 A 的上下滚动,但也可以左右滚动.滚动视图 A 始终在屏幕上.
For instance, I have a scroll view (A) on the left of a screen, whose contents can scroll up and down, but not left and right. Scroll view B matches the up and down of A, but can also scroll left and right. Scroll view A is always on the screen.
----------------------------------------------------------- | | | | | | | | | | A | B | | | | | scrolls | | | up & down | scrolls all directions | | | | -----------------------------------------------------------
我将如何做到这一点,以便(任一视图的)上下滚动也会使另一个视图沿相同的上下方向滚动?还是有其他方法可以做到这一点?
How would I make it so the the up and down scrolling (of either view) also makes the other view scroll in the same up-down direction? Or is there another method to do this?
推荐答案
将滚动视图 A 的委托设置为您的视图控制器...然后...
Set the delegate of scroll view A to be your view controller... then have...
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint offset = scrollViewB.contentOffset; offset.y = scrollViewA.contentOffset.y; [scrollViewB setContentOffset:offset]; }
如果您希望双方互相关注,则为他们设置委托并使用...
If you want both to follow each other, then set delegate for both of them and use...
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if([scrollView isEqual:scrollViewA]) { CGPoint offset = scrollViewB.contentOffset; offset.y = scrollViewA.contentOffset.y; [scrollViewB setContentOffset:offset]; } else { CGPoint offset = scrollViewA.contentOffset; offset.y = scrollViewB.contentOffset.y; [scrollViewA setContentOffset:offset]; } }
上面可以重构为有一个方法,它接受两个滚动视图并匹配另一个.
The above can be refactored to have a method which takes in two scrollviews and matches one to the other.
- (void)matchScrollView:(UIScrollView *)first toScrollView:(UIScrollView *)second { CGPoint offset = first.contentOffset; offset.y = second.contentOffset.y; [first setContentOffset:offset]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if([scrollView isEqual:scrollViewA]) { [self matchScrollView:scrollViewB toScrollView:scrollViewA]; } else { [self matchScrollView:scrollViewA toScrollView:scrollViewB]; } }
Swift 3 版本:
func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView == scrollViewA { self.synchronizeScrollView(scrollViewB, toScrollView: scrollViewA) } else if scrollView == scrollViewB { self.synchronizeScrollView(scrollViewA, toScrollView: scrollViewB) } } func synchronizeScrollView(_ scrollViewToScroll: UIScrollView, toScrollView scrolledView: UIScrollView) { var offset = scrollViewToScroll.contentOffset offset.y = scrolledView.contentOffset.y scrollViewToScroll.setContentOffset(offset, animated: false) }