描述
如果您在iOS或Android上使用Spotify应用程序(我在iOS上开发),您会注意到如果您选择播放列表,并将UITableView与您的歌曲一起拖动,则以下发生的情况:
桌子不滚动,它只是以它滚动的速度向上移动,并且它上面的图像比桌子移动得慢,从而产生视差滚动效果。 然而,一旦tableview到达视图的顶部,它就像普通的滚动tableview一样。
我试图通过几种不同的方式实现这种效果,这对我不起作用。
以下是此效果的视频:https://www.dropbox.com/s/n7npk4lrzmag0sn/IMG_9331.MOV
我尝试了什么
我希望UITableView和它上面的UIScrollView在用户滚动任何一个时向上移动,所以我用了
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
并根据滚动的方向,我改变了tableview的框架位置和它上面的UIScrollView。
这种方法的问题是桌面视图反弹,这会破坏效果。
为了摆脱弹跳,我尝试了以下方法:
_userTableView.bounces = NO;
但是,现在因为tableview不会滚动,所以永远不会调用scrollViewDidScroll。
我尝试的另一件事是继承UITableView并覆盖
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
hitTest方法检测tableview上的滚动手势,问题是:
tableview的大小应该会增加,以容纳更多添加到视图中的单元格(无需滚动),因为它向上移动视图,或者它应该以与视图相同的大小开始。在它到达顶部之后,它应该像普通的桌面视图一样开始滚动 - 在向上移动之后具有相同的动量。
关于如何解决这个问题的任何建议?
非常感谢。
答案 0 :(得分:2)
对于您展示的效果,我认为将tableHeaderView
视差内容作为子视图就足够了。
在-scrollViewDidScroll:
(或contentOffset
的KVO)中,您将视差子视图的center
设置为tableHeaderView
的可见边界的中心。您还可以通过乘以一个因子来调整内容“粘”到中心的程度。
CGRect tableViewHeaderVisibleBounds = tableViewHeader.bounds;
tableViewHeaderVisibleBounds.origin.y = MAX(0, MIN(CGRectGetHeight(tableViewHeader.bounds), tableView.contentOffset.y));
tableViewHeaderVisibleBounds.size.height -= tableViewHeaderVisibleBounds.origin.y;
CGFloat factor = 1.8f; // less than 0.5:stick to top // greater than 0.5:stick to bottom
parallaxContentView.center = (CGPoint){
.x = parallaxContentView.center.x,
.y = (CGRectGetMinY(tableViewHeaderVisibleBounds)
+ (CGRectGetHeight(tableViewHeaderVisibleBounds) * factor))
};
我在脑海中编码,所以只需做出必要的调整,但我希望你能得到基本的想法。