iOS中UIView的垂直视差滚动

时间:2013-06-15 16:20:06

标签: ios objective-c uiview parallax uipangesturerecognizer

我正在尝试在几个视图之间添加垂直视差滚动效果,这些视图都是屏幕的大小。

通过按钮完成时并不太复杂,但是我希望它由UIPanGesture控制,类似于iOS的Year Walk Companion App。此处显示的当前等式无法正常工作。

目前这个版本只会移动前两个视图,因为一旦我得到那些工作,其余的应该很容易。我还没有列出阻止某些观点在某些方向上移动的所有检查,因为这也与问题无关。

以下是使用按钮的网络版:http://flycarpodacus.zxq.net/iPhone%20Parallax/event.html

希望有人可以提供帮助。

ViewController.h

@interface ViewController : UIViewController {
    UIPanGestureRecognizer *panGesture;
    int activeView;
    int nextView;
    float offset;
    float speed;

}
@property (weak, nonatomic) IBOutlet UIView *view1;
@property (weak, nonatomic) IBOutlet UIView *view2;
@property (weak, nonatomic) IBOutlet UIView *view3;
@property (weak, nonatomic) IBOutlet UIView *view4;

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize view1, view2, view3, view4;
- (void)viewDidLoad
{
    [super viewDidLoad];
    activeView = 1;
    offset = 220;
    speed = 1;
    panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];

    [self.view addGestureRecognizer:panGesture];

    if (self.view.frame.size.height != 568) {
        CGRect frame = self.view.frame;
        frame.size.height = self.view.frame.size.height;
        view1.frame = frame;
        view2.frame = frame;
        view3.frame = frame;
        view4.frame = frame;
    }

    view4.center = CGPointMake(view4.center.x, self.view.frame.size.height/2 + offset);
    view3.center = CGPointMake(view3.center.x, self.view.frame.size.height/2 + offset);
    view2.center = CGPointMake(view2.center.x, self.view.frame.size.height/2 + offset);
    view1.center = CGPointMake(view1.center.x, self.view.frame.size.height/2);
}
- (void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint panGestureTranslation = [panGestureRecognizer translationInView:self.view];

    switch (activeView) {
        case 1:
            view1.center = CGPointMake(view1.center.x, panGestureTranslation.y + self.view.frame.size.height/2);
            view2.center = CGPointMake(view2.center.x, view2.center.y - 2.5f);
            break;

        default:
            break;
    }
}

2 个答案:

答案 0 :(得分:0)

好的,在我看来,你可以尝试做类似的事情:

首先只使用两个视图,在您的示例中,只有两个视图同时可见,因此您可以重新使用该视图 您要显示的下一张幻灯片。

所以在开始时你有2个视图(假设它们的大小与屏幕300x500相同,是的,我知道它们不是真正的大小, 但数学会更容易:p)。 在初始化功能位置,您可以在150x250(屏幕中心)的位置查看一个,在150x500处查看屏幕2(所以你只看到 视图的上半部分。)

让我们调用panGestureTranslation.y:DeltaY(会更快)。所以在函数panGestureRecognizer中你要移动两个视图 使用parralex效果,在这个确切的情况下,一个简单的解决方案是移动view1的2 * DeltaY和view2的DeltaY,就像那样,当view1 将完全退出屏幕,视图二将在它的中心。

” view1.center = CGPointMake(view1.center.x,view1.center.y + 2 * DeltaY); view2.center = CGPointMake(view1.center.x,view2.center.y + DeltaY); “

你可以知道是否通过测试视图的位置来完成(如果position.y是< = 0,那么它就完成了。

完成后,您有两个选择,首先您将view1放在view2的底部(位置150x500并显示在view2后面)并且您感觉它与您的第3个内容,然后切换booleen 与下一帧相反的做法(你将移动2 * DeltaY的view2和DeltaY的view1)。

其他解决方案是将两个视图移动到原始位置(view1为150x250,并在150x500处查看两个),并感觉view1具有view2的内容(你必须在没有动画的情况下进行) 所以用户没有看到视图有切换),并感觉view2与你第3内容,所以下一帧,完全相同的代码将再次工作。你可以使用这种方法获得无限的内容。

” view1.center = CGPointMake(view1.center.x,view1.center.y + 2 * DeltaY); view2.center = CGPointMake(view1.center.x,view2.center.y + DeltaY); “

如果我在某些方面不清楚,请告诉我^^。

答案 1 :(得分:-1)

我建议查看我们关于视差效应的文章,详细解释和开源实现=> http://blog.denivip.ru/index.php/2013/08/parallax-in-ios-applications/?lang=en