2012-05-01 17 views
6

360度の大きなパノラマ画像を使用してiPhoneアプリを作成しています。パノラマは、UIScrollViewのCATiledLayerです。無限スクロール - setContentOffset:UIScrollViewの減速を停止します

イメージに無限スクロールを実装しようとしています(水平のみ)。私はUIScrollViewをサブクラス化し、setContentOffset:とsetContentOffset:animated:を実装することでこれを行いました。これは、ユーザーがscrollviewをドラッグしているときに完全に機能します。しかし、ユーザが指を離してスクロールビューが減速しているときに、contentOffsetを変更すると、即座に減速が停止します。

- (void)setContentOffset:(CGPoint)contentOffset 
{  
    CGPoint tempContentOffset = contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     tempContentOffset = CGPointMake(1, tempContentOffset.y); 
    } 
    else if ((int)tempContentOffset.x <= 0) 
    { 
     tempContentOffset = CGPointMake(5113, tempContentOffset.y); 
    } 

    [super setContentOffset:tempContentOffset];  
} 

減速に影響を与えずにcontentOffsetを変更する方法はありますか?

hereは、setContentOffset:(not setContentOffset:animated :)をオーバーライドするとこの問題は解決されますが、動作させるように見えません。

私もscrollRectToVisibleを試しました:アニメーション:成功なし。

この問題を解決する方法についてのアイデアは非常に高く評価されます。ありがとう!

EDIT:scrollViewDidScrollため

コード:私もこれを試してみました

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset]; 
} 

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    CGPoint tempContentOffset = panoramaScrollView.contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y); 
    } 
    else if ((int)tempContentOffset.x == 0) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y); 
    } 
} 

答えて

2

を変更するだろう、私は回避策で問題が解決したときに、それが呼ばれています。私は、パノラマの3つの幅でパノラマ画像を作成しました(私はCATiledLayerを使用しているためパフォーマンスにはあまり影響がありません)。decelerationRateプロパティをUIScrollViewDecelerationFastに設定しました。したがって、ユーザは減速が停止する前にあまりにも遠くにスクロールすることができず、左または右のパノラマ画像のいずれかで減速が停止すると、コンテンツオフセットが中間画像に戻される。これは無限のスクロールの外観を持ち、私が考え出すことができる最高のソリューションです。

だけbounces=YESalwaysBounceHorizontal=YESまたは/およびalwaysBounceVertical=YES(あなたがするスクロール方向に依存)を設定:

+0

'UIScrollViewDecelerationFast'の必要性を避けるためには、' contentSize'を非常に大きくして三角幅のコンテンツビューと視点を途中から始め、そのコンテンツビューを手配してくださいスクロール中に再配置される。その後、減速が停止したら、すべてをもう一度中央に戻します。 – hatfinch

+0

@hatfinchご意見ありがとうございます。それは私がやったこととほぼ同じですが、私はあなたが "スクロール中にそのコンテンツビューを再配置するように手配する"ということを100%確信しているわけではありません。これがどのように機能するのか説明できますか? –

+0

これは、説明した方法と同じように機能しますが、ユーザーが3倍幅パノラマをスクロールできないように減速を犠牲にするのではなく、パノラマを動かしています。したがって、ABCのコンテンツビューでは、スクロールビューにxxxABCxxxがあります(xは空白です)。左側に1つの画像幅をスクロールした後、xxABCxxxxを持つようにコンテンツビューを移動します。あなたがそれほど多くの「x」でそれをすることを除いて、彼らは端に達することを試みることについて非常に熟考しなければならないでしょう。それは理にかなっていますか? – hatfinch

0

私はUIScrollViewDelegateプロトコルメソッドを使用しようとするだろう:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 

ユーザー

スクロール(それが減速ていても)とは、その中に私がcontentoffset

+0

のscrollViewDidScroll方法です。私はscrollViewDidScrollのcontentOffsetを直接設定しようとしましたが、運はありません。 コンテンツのオフセットが設定されるたびに、減速が即座に停止します。下のログ出力はコンテンツオフセットの変更を示し、scrollViewDidEndDeceleratingがトリガーされます。 '(62.000000 0.000000)(22.000000 0.000000)(0.000000 0.000000)(5113.000000 0.000000)scrollViewDidEndDecelerating' –

+0

どのように?あなたのscrollViewDidScrollのコードを投稿してください... – meronix

0

私は最近、同じ無限スクロールを行うと、誤った解が見つかりました。

これは、これは私のために働く。私は上記のようsetContentOffsetメソッドを呼び出していますどこ:)

1

代わり

[scrollView setContentOffset:tempContentOffset]; 

使用

scrollView.contentOffset = tempContentOffset; 
関連する問題