【问题标题】:Linking 2 UIScrollView with different paging sizes链接 2 UIScrollView 与不同的分页大小
【发布时间】:2014-01-20 06:02:45
【问题描述】:
我有一个iphone app,我想在其中执行以下操作:
- 一个类别标题栏,它是一个水平的
scrolling 自定义分页大小UIScrollView,用户可以在其中通过swiping 左右切换类别。
- 标题栏下方的类别内容页面,也是水平滚动的
UIScrollView(全屏宽度分页)。用户还可以通过向左或向右滑动来在内容页面之间切换。
我想要达到的目标如下:
-
UIScrollViews 都链接在一起,因此在类别标题栏中滑动也会滑动内容页面,或者在内容页面中滑动也会滑动标题栏。
- 如果无法做到这一点,那么至少,用户必须能够滑动内容页面,并且标题也相应地滑动(不需要反向操作)。
我确实记得看到一些应用程序实现了类似的功能,但我现在想不起来了。有什么想法我该怎么做?
谢谢!
【问题讨论】:
标签:
ios
iphone
objective-c
uiscrollview
【解决方案1】:
我已经在我的应用程序中完成了。类别视图就像一个“展示”视图,在滑动或触摸后,触发通知。内容可以是UICollectionView,因此它有setContentOffset: 方法来“转到”目标页面。或者您可以在 contentView 中使用addChildViewController,并与 pagingEnabled UIScrollView 结合使用。
【解决方案2】:
参考Making two UIScrollViews follow each others scrolling,我将两个滚动视图的 UIScrollView 委托设置为父视图控制器,并调用了 scrollViewDidScroll 方法。
- (void)matchScrollView:(UIScrollView *)first toScrollView:(UIScrollView *)second {
CGPoint offset = first.contentOffset;
offset.x = (second.contentOffset.x/second.frame.size.width) * first.frame.size.width;
first.contentOffset = offset;
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if([scrollView isEqual:firstScrollView]) {
isSecondScrolling = NO;
} else if ([scrollView isEqual:secondScrollView]) {
isSecondScrolling = YES;
}
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if ([scrollView isEqual:firstScrollView] && isSecondScrolling == NO) {
[self matchScrollView:secondScrollView toScrollView:firstScrollView];
} else if ([scrollView isEqual:_midPanelScrollView] && isSecondScrolling == YES) {
[self matchScrollView:firstScrollView toScrollView:secondScrollView];
}
}
但是我添加了布尔值 isSecondScrolling,以阻止 firstScrollView 在 secondScrollView 滚动时启动 matchScrollView。否则会导致 secondScrollView 的框架在每次滚动后稍微偏离。