2012-06-10 10 views
25

実際に次のページにスクロールするときにページングが有効になっているスクロールビューのスムーズなアニメーションを再現しようとしています。 UIViewAnimationCurveEaseInOutと思われますが、私は「次のページ」ボタンを持って、プログラム的にスクロールする必要があります。それは醜いリニアアニメーションで次のページに行き、私はUIViewAnimationCurveEaseInOutの滑らかさを再現するために管理することはできません非線形アニメーションのUIScrollview setContentOffset?

-(void) scrollToPage:(int)page 
{ 
    UIScrollView *scrollView = contentView; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y); 
    [scrollView setContentOffset:offset animated: YES];  
    [self pageControlUpdate]; 
} 

-(void) scrollToNextPage 
{ 
    [self scrollToPage:(pageControl.currentPage + 1)]; 
} 

setContentOffsetで、またはscrollRectToVisibleとのいずれか ...

:ここ

は私のコードです

私もそれを手動でアニメーション化しようとした:

[UIView animateWithDuration:.5 delay:0 options:UIViewAnimationCurveEaseInOut animations:^{ 
    scrollView.contentOffset = offset; 
} completion:^(BOOL finished) { } ]; 

どこが間違っていますか?

+0

私はこれを見つけました:http://developer.apple.com/library/ios/#DOCUMENTATION/WindowsViews/Conceptual/UIScrollView_pg/ScrollingViewContent/ScrollingViewContent.html私が見たことを確認します: 'setContentOffset:animated:メソッドは、コンテンツを指定されたコンテンツオフセットに変換します。アニメートされたパラメータがYESの場合、スクロールは現在の位置から指定された位置に一定のレートでアニメートされます。 ' – Diwann

+0

arg。誰も手掛かりがないだろうか? – Diwann

+0

「UIViewAnimationCurveEaseInOut」が機能しない場合は、おそらく別のアニメーションカーブです。 Appleがこのアニメーションにカスタムカーブを使用する可能性は非常に高いです。 'CAPropertyAnimation'を使って、' CAMediaTimingFunction'の形で独自のカスタムカーブを定義することができます。さまざまなコントロールポイントで遊ぶ価値があるかもしれません。 –

答えて

21

あなたがNOanimated:などのパラメータを渡す必要があり、独自のアニメーション作るたび:パブリックAPIを使用すると

- (void)scrollToPage:(int)page 
{ 
    UIScrollView *scrollView = contentView; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, 
           scrollView.contentOffset.y); 

    [UIView animateWithDuration:.5 
          delay:0 
         options:UIViewAnimationCurveEaseInOut 
        animations:^{ 
         [scrollView setContentOffset:offset animated:NO]; 
        } completion:nil]; 

    [self pageControlUpdate]; 
} 
+0

およびbtw。フィックスアニメーションの時間が奇妙に見えることがあります。例えば2行だけスクロールするだけで半分かかります。あなたが本当に長いリストを持っていて、上から下にスクロールすれば、半分の速さで超高速になります。 –

+0

この説明をお寄せいただきありがとうございますが、私は全ページ幅だけスクロールするので、常に同じ速度に見えます。 私はanimated:NOパラメータを試しましたが、固定レートでスクロールし続けます。 UIViewAnimationCurveアニメーションも変更しようとしましたが、同じように見えます。 私はOleのカスタムCAPropertyAnimationソリューションを試しています。 – Diwann

+0

これは素晴らしい動作します。小さなニックピットだが、UIViewAnimationOptionCurveEaseInOutにする必要があります。 –

6

は、私はこれが現在可能であるとは考えていません。アニメーションの過程でユーザーのやりとりが必要ないとすれば、代わりにUIScrollViewのサブビュー(つまりスクロールビューのコンテンツ)の位置をアニメートし、アニメーションなしでcontentOffsetを調整する方が良いでしょう。

- (void) scrollToPage:(int)page { 
    UIScrollView *scrollView = contentView; 
    scrollView.userInteractionEnabled = NO; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y); 
    CGFloat delta = offset.x - scrollView.contentOffset.x; 

    __block int animationCount = 0; 
    for (UIView *view in scrollView.subviews) { 
     [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      animationCount++; 
      CGRect frame = view.frame; 
      frame.origin.x -= delta; 
      view.frame = frame; 
     } completion:^(BOOL finished) { 
      animationCount--; 
      if (animationCount == 0) { 
       scrollView.contentOffset = offset; 
       for (UIView *view in scrollView.subviews) { 
        CGRect frame = view.frame; 
        frame.origin.x += delta; 
        view.frame = frame; 
       } 
       scrollView.userInteractionEnabled = YES; 
      } 
     }]; 
    } 
} 

これは期待どおりに動作することが確認でき、自分でテストしました。

+0

はい、興味深いのは別の解決策です。しかし、私はリアルタイムのcontentOffset値を使用して、スクロール中にスクロールビュー内のビューを移動する必要があります。このソリューションはscrollviewdidscrollをトリガーしません。 – Diwann

+0

最後に 'contentOffset'を設定すると、' scrollViewDidScroll'を起動します。しかし、あなたは 'scrollViewDidScroll'で実行する特別な処理を抽出し、代わりにこのメソッド内で使用することができます。 –

+0

また、 'UIScrollView'サブビューのすべてを別の' UIView'に埋め込むことができます。アニメーション中に 'scrollViewDidScroll'と本質的に等価であるため、' setFrame: 'をサブクラス化してオーバーライドすることができます。 –

4
[UIView animateWithDuration:(Animation_Duration) 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
        [scroll setContentOffset:CGPointMake(PointX, PointY) animated:NO]; 
         } 
        completion:^(BOOL finished){}];` 
3

このクラスは絶対に私の人生を救っ:

MOScroll on GitHub.com

それはちょうどプライベートAPIのようなしかし、すべてのパブリックメソッドと数学で

- (void)setContentOffset:(CGPoint)contentOffset withTimingFunction:(CAMediaTimingFunction *)timingFunction duration:(CFTimeInterval)duration;

を持っています。

+0

MOScrollの作業リンク:https://github.com/plancalculus/MOScrollView – Koen

関連する問題