我正在尝试在几个视图之间添加垂直视差滚动效果,这些视图都是屏幕的大小。
通过按钮完成时并不太复杂,但是我希望它由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;
}
}
答案 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