2013-06-15 2 views
3

모든 화면 크기의 여러보기간에 수직 시차 스크롤 효과를 추가하려고합니다.iOS에서 UIView의 수직 시차 스크롤링

버튼을 통과 할 때 너무 복잡하지는 않지만 iOS의 경우 Year Walk Companion App과 유사하게 UIPanGesture에서 제어해야합니다. 여기에 표시된 현재 방정식이 올바르게 작동하지 않습니다.

현재이 버전은 처음 두 개의보기 만 이동합니다. 작업을 완료하면 나머지는 쉬워야하기 때문입니다. 특정 견해가 특정 방향으로 움직이는 것을 막을 수있는 모든 수표를 포함시키지 않았기 때문에 문제도 관련이 없습니다. 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

좋아, 그래서 내 관점에서 당신은 그런 식으로 뭔가를 시도 할 수 :

처음 사용할 때 두 개의보기 귀하의 예제에서는 동시에 두 개의보기 만 표시되므로 표시 할 다음 슬라이드는 의보기를 다시 사용할 수 있습니다.

처음에는 2 개의보기가 있습니다 (화면 크기가 300x500 인 것과 같음). 실제 크기가 아니라는 것을 알고 있습니다 (예 : ). 수학적으로 더 쉽게 알 수 있습니다. p). init 함수에서 150x250 (화면의 중심) 위치와 150x500 (2 번째보기의 위쪽 절반 만 볼 수있는 ) 화면 2를 볼 수 있습니다.

은 panGestureTranslation.y : DeltaY (더 빠름)를 호출 할 수 있습니다. 따라서 panGestureRecognizer 함수에서 두 개의 뷰을 parralex 효과로 이동하려는 경우이 정확한 경우의 간단한 해결책은 뷰 1 이 종료 될 때 viewA1의 2 * DeltaY 및 view2의 DeltaY를 이동하는 것입니다. 화면 completly, 전망 2는 그것의 센터에서 맞을 것이다.

" view1.center = CGPointMake (view1.center.x, view1.center.y + 2 * deltaY에) view2.center = CGPointMake (view1.center.x, deltaY에 view2.center.y +) ;. "

position.y가 0보다 = < 경우 마무리는보기 하나의 위치 (테스트입니다 경우가 마무리 그래서 당신이 알 수

때 마무리는, 먼저, 두 가지 선택의 여지가 당신은 view2의 하단에 view1을 놓고 (150x500 위치에 있고 view2 뒤에 표시) 그리고 3 번째 내용으로 느낀다. 그러면 booleen을 바꾼다. 다음 f의 반대편에있는 excact를 수행한다. rame (2 * DeltaY의 view2와 DeltaY의 view1을 이동합니다).

다른 해결책은 원래 위치 (150x250의 view1 및 150x500의 두 가지보기)에서 두보기를 이동하고 view2의 내용으로 view1을 느끼는 것입니다 (사용자는 애니메이션없이 없이 수행해야합니다. 보기에 전환이 있음을 확인하십시오.) 그리고 3 번째 내용으로 view2를 느끼고 다음 프레임에서 똑같은 코드가 다시 작동합니다. 당신은이 방법으로 무한의 내용을 가질 수 있습니다.

" view1.center = CGPointMake (view1.center.x, view1.center.y + 2 * deltaY에) view2.center = CGPointMake (view1.center.x, deltaY에 view2.center.y +) ; "

내가 어떤 점에서 분명하지 않다면 알려주지 ^^.