我有几个tableview单元格比它们更高。因此,我正在实施视差滚动,以便您在向上/向下滚动时可以看到更多图像
一些code examples几乎让我在那里,但是当我使用AutoLayout时,我发现当你第一次开始滚动时会有一个“跳跃”,因为实际图像位置和预期位置不同。我已经尝试在viewDidAppear和didLayoutSubviews上调用布局函数,尝试在第一次设置后将其踢成形状,但没有运气。
This answer建议使用AutoLayout的解决方案看起来非常简洁,所以我在第一次调整了代码,但它仍然会跳转。如果我使用该答案中建议的代码,它会遍布整个地方
CGRect rectInSuperview = [tableView convertRect:self.frame toView:view];
float distanceFromCentre = CGRectGetHeight(view.frame)/2 - CGRectGetMinY(rectInSuperview);
float difference = CGRectGetHeight(self.eventImage.frame) - CGRectGetHeight(self.frame);
float move = (distanceFromCentre / CGRectGetHeight(view.frame)) *difference;
CGRect imageRect = self.eventImage.frame;
imageRect.origin.y = -(difference/2)+move;
self.verticalCenter.constant = move;
现在发生的事情是滚动效果很好,但是一旦你开始第一次滚动,元素就会跳下约30px ish。所以我需要它在没有这个初始跳跃的情况下工作?
初始屏幕加载:
滚动1px后(注意第一张和最后一张图像的跳转):
答案 0 :(得分:1)
我更新了链接的answer,
@implementation TableViewController
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSArray * cells = [self.tableView visibleCells];
for (TableViewCell* cell in cells) {
NSIndexPath * indexPathOfCell = [self.tableView indexPathForCell:cell];
CGRect cellRect = [self.tableView rectForRowAtIndexPath:indexPathOfCell];
cell.verticalCenter.constant = (scrollView.contentOffset.y -cellRect.origin.y)/kParallaxRatio;
}
}
现在,我没有将约束常量更改为scrollview内容偏移量,而是引入了cellRect
以确保当它位于tableview的顶部时,单元格的约束常量为零。
您可以找到示例here。