2009-09-01 20 views
4

誰かが左から右へコンテンツをスクロールするためにワイプジェスチャーを実行すると、同じ方向にスクロールしながら別の速度で背景画像を表示したいと思います。これらの古典的なゲームが20年前に何をしたのと同じように(覚えて、誰でもか?)UIScrollViewで異なる速度で背景をスクロールする

答えて

2

あなたはCoreAnimationで行うことができます。あなたはscrollViewDidEndDragging:willDecelerate:scrollViewWillBeginDecelerating:UIScrollViewDelegateの方法にフックしたいと思うでしょう。その後、中心の位置を変更して画像上でアニメーションを開始します。アニメーションの詳細については、this SO articleを参照してください。

+0

私はコアアニメーションで試してみましたが、スクロールが非常に遅くなってしまい、サッカーとしてはもう気分が良くなりません。 Ries –

5

2つのUIScrollViewのインスタンスを使用してこれを実行しました。最初の部分は実際のコンテンツが表示され、2番目の部分(最初はzオーダーの後ろにあります)は、動きの遅い背景がある場所です。そこから上部UIScrollViewには、contentOffsetが変更されたときに通知を受ける代理人が添付されています。その代理人は、次に、バックグラウンドスクロールのcontentOffsetをプログラムで設定し、フォアグラウンドに対してスクロールを遅くするために定数に乗算します。だから、例えば、あなたのような何かを持っているかもしれません:あなたはこのようなものになってしまいますあなたは簡単にそれの下でUIImageViewでスクロールしたスクロールビューを実装することによってこれを行うことができます

// Defined as part of the delegate for the foreground UIScrollView 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    UIScrollView* scroll_view(static_cast<UIScrollView*>(bkg_scroller_m.view)); 
    CGPoint  offset(scrollView.contentOffset); 

    offset.x = offset.x/3; 
    offset.y = offset.y/3; 

    // Scroll the background scroll view by some smaller offset 
    scroll_view.contentOffset = offset; 
} 
3

... を...あなたが望むようbackgroundImageViewはUIImageViewているとサブビュー前に、ビューに追加...あなたはたとえば、パフォーマンス上の問題

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    {  
     float factor = scrollView.contentOffset.x/(scrollView.contentSize.width - 320); 
     if (factor < 0) factor = 0; 
     if (factor > 1) factor = 1; 

     CGRect frame = backgroundImageView.frame; 
     frame.origin.x = factor * (320 - backgroundImageView.frame.size.width); 
     backgroundImageView.frame = frame; 
    } 
+0

これは素晴らしいです。これは受け入れられた答えでなければなりません! – quantum

+0

これは絶対的な作業です –

0

ずにできるだけ多くの画像ビューを階層化することができますが、複数のscrollviewsを持っている彼らは、差分速度をスクロールします。ここにSalamatizmの修正コードベースがあります。答え:

CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    float factor = scrollView.contentOffset.x/(scrollView.contentSize.width - screenSize.width); 
    if (factor < 0) factor = 0; 
    if (factor > 1) factor = 1; 

    CGSize parralaxSize = self.parralaxBackgroundView.contentSize; 
    CGPoint parallaxOffset = CGPointMake(-(factor * (screenSize.width - parralaxSize.width)), 0); 
    [self.parralaxBackgroundView setContentOffset:parallaxOffset animated:NO]; 
関連する問題