水平视差不按预期工作

时间:2014-03-06 00:29:03

标签: ios objective-c uiscrollview parallax

我正在尝试使用UIScrollView进行视差效果,每个“页面”会有一个UIImageView和UILabel,当用户滚动页面时,UIImageView将以比当前页面更快的速度消失。 UILabel,下一个UIImageView和UILabel出现。

我的代码在第一页上工作正常,因为没有考虑放大器,因此无法在任何其他页面上工作; UIImageView在页面中不是水平居中的,应该是它。

请你告诉我我哪里出错了?

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint offset = scrollView.contentOffset;
    NSInteger currentPage = floorf(offset.x / CGRectGetWidth(self.view.frame));
    if (currentPage >= 0 && currentPage < CINNumberOfWalkthroughs) {
        NSInteger lastPage = self.pageControl.currentPage;
        self.pageControl.currentPage = currentPage;

        float imageViewAmplifier = offset.x / scrollView.contentSize.width;
        UIImageView *imageView = self.imageViews[currentPage];

        float w = CGRectGetWidth(self.view.frame);
        float a = CGRectGetWidth(imageView.frame);

        imageView.center = CGPointMake((currentPage * w) + ((w + a) / 2) + (offset.x * imageViewAmplifier), imageView.center.y);
    }
}

我使用以下计算来确定每个UIImageViews的中心位置,然后添加一部分偏移量来添加移动效果。

enter image description here

1 个答案:

答案 0 :(得分:0)

我设法通过简化事情来解决问题 - 我倾向于使所有使得这项任务变得更加困难的事情过于复杂化。

我没有计算imageView的当前中心并通过转换中心点来执行翻译,而是使用了一个简单的CGAffineTransformMakeTranslation(),它可以为我有效地处理所有这些问题。我必须做的就是从页面的原点算出实际的偏移量,然后修复放大器,通过计算实际偏移量和滚动视图的内容大小之间的比例来校正放大器。我的工作解决方案可以在下面找到:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint offset = scrollView.contentOffset;
    NSInteger currentPage = floorf(offset.x / CGRectGetWidth(self.view.frame));
    if (currentPage >= 0 && currentPage < CINNumberOfWalkthroughs) {
        self.pageControl.currentPage = currentPage;

        UIImageView *imageView = self.imageViews[currentPage];

        float multiplier = -1 * (offset.x / scrollView.contentSize.width);
        float w = CGRectGetWidth(self.view.frame);

        imageView.transform = CGAffineTransformMakeTranslation((offset.x - currentPage * w) * multiplier, 0);

        UILabel *instructionLabel = self.instructionLabels[currentPage];
        instructionLabel.transform = CGAffineTransformMakeTranslation((offset.x - currentPage * w) * (multiplier - 0.4), 0);
    }
}