使用自动布局在tableview图像上的视差

时间:2015-11-22 11:38:09

标签: ios uitableview autolayout uistoryboard parallax

我有几个tableview单元格比它们更高。因此,我正在实施视差滚动,以便您在向上/向下滚动时可以看到更多图像

Example of desired effect

一些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。所以我需要它在没有这个初始跳跃的情况下工作?

初始屏幕加载:

enter image description here

滚动1px后(注意第一张和最后一张图像的跳转):

enter image description here

1 个答案:

答案 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