2012-09-04 22 views
5

UITableViewでカスタムサイズのページのページングを実装しようとしています。 私が達成しようとしているのは、アクティブなセルの上端を、tableViewの最上部にある の上端に揃え、次のセルの上端をtableViewの下端に表示します(スクロールしてさらに見る細胞)。カスタムページングのような振る舞いを持つUITableView

私の細胞はすべて同じ高さです。

paging=YESと設定すると、ページをめくるほど、少しずつオフセットが大きくなります。これは、私のtableViewが1つのセルよりも少し高く、セルの高さ/ページサイズが整列していないためです。

私はページングを有効にしてさまざまなことを試みました。私は、セルの高さにtableViewのサイズを設定しようとしたが、ユーザーがまだ次のセルを見ることができるように、クリッピングとマスキングをオフにします。これは、次のセルがtableViewのバウンディングボックスにスクロールする前の最後のmsで基本のscrollViewにのみ追加されるため、機能しません。

次に、ページングの動作を模倣するさまざまなscrollViewデリゲートメソッドの実装を開始しました。私が持っている

は、とりわけ、このような何かを試してみました:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

それは一種の正しいことをしていますが、それが有効になってページングとscrollView /のtableViewのようなものを振る舞うん。

私は同じことを達成しようとしている人からいくつかの投稿を見つけましたが、答えは私が自分で試みたものと同じ "非ネイティブスナップフィール"に苦しんでいます。

ありがとうございました。

のiOS> = 5.0

+0

これはうまくいきましたか? – aqs

+0

@aqs申し訳ありませんが、実際にはページ分割のようにポーズをとることはありませんでした。 – RickiG

+0

心配しないでください。私はこのhttps://github.com/100grams/HGPageScrollViewを使って、垂直にスクロールさせるように修正しました。私の目的を果たします – aqs

答えて

3

あなたはUIScrollViewデリゲート関数を使用することができますページングオフにした場合:

-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

あなたの出発に最も近いではない、トップ戻るtargetContentOffsetに最も近いセルの座標するscrollViewWillEndDragging:withVelocity:targetContentOffset:を実装オフセット。提供されたソリューションjjv360はうまくいきますが、あなたのセルが平均的にどれほど高いかによって少し調整したいかもしれません(jjv360のソリューションは本当に大きなセルではうんざりかもしれません)。

私はちょうどあなたがより多くの(ちょうど/のviewDidLoad /どこのinitに一度それを行う)そのdecelerationRateプロパティを変更することにより、UIScrollViewをページングのように振る舞うように速くUITableViewの減速を作ることができることを追加したいと思います。

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

ありがとうFilip、私は今それを試してみましょう。ネイティブビヘイビアーを使ってページングを行うと、いくつかのページをジャンプすることができません。エンドポイントをtargetContentOffsetにクランプするとどうなるでしょう。これは、次のセルまたは前のセルのいずれかにする必要があります。 decelerationRate - 私はこれまでに見たことがない、素晴らしい:) – RickiG

+0

ページングが有効なときにdecelerationRateが動作しないように見えます。とにかくこのAPIを指してくれてありがとう:) – Tomasz

1

私はこのコードでこの問題は解決:正しい方法を指しているためhttp://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

感謝を。

関連する問題