ios – UIScrollView子视图的视差效果

我试图在UIScrollView中的UIView上创建一个视差效果.
效果似乎有效,但效果不好.

>首先,我将两个UIView子视图添加到UIScrollView并设置UIScrollViews contentSize.
>视图总结并创建一个{320,1000}的contentSize.
>然后我在scrollViewDidScroll中实现了以下内容

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat offsetY = scrollView.contentOffset.y;

    CGFloat percentage = offsetY / scrollView.contentSize.height;

    NSLog(@"percent = %f",percentage);

    if (offsetY < 0) {

        firstView.center = CGPointMake(firstView.center.x,firstView.center.y - percentage * 10);

    } else if (offsetY > 0){

        firstView.center = CGPointMake(firstView.center.x,firstView.center.y + percentage * 10);

    }
}

这些代码行确实产生了视差效果,但是随着滚动继续,如果我滚动到原始的起始位置,则视图不会恢复到原始位置.

我已经尝试操纵视图层和框架,都具有相同的结果.

任何帮助将不胜感激.

解决方法

您所遇到的问题是您将基于偏移量与缩放比例的次要滚动,而不仅仅是当前的偏移量.所以当你从99的偏移增加到100(100)之后,你的辅助卷轴会增加10个,但当你回到99时,你的辅助卷动只能减少9.9,因此不再是这是最后一次你在99.非线性滚动是可能的,但不是你这样做的方式.

一个可能的更容易的方式来处理这个是创建一个第二个滚动视图,并将其放在实际的滚动视图之下.使它变得非难处理(setUserInteractionEnabled:false),并在主滚动委托期间修改它的contentOffset,而不是手动移动UIImageView.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [scrollView2 setContentOffset:CGPointMake(scrollView.contentOffset.x,scrollView.contentOffset.y * someScalingFactor) animated:NO];
}

但是请确保不为scrollView2设置委托,否则可能会得到一个循环委托方法调用,这不会为您结束.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...