5

UITableView でカスタム サイズのページのページングを実装しようとしています。私が達成しようとしているのは、tableView の下部にある次のセルの上部を表示しながら、アクティブなセルの上部を tableView の上部に揃えることです (ユーザーがスクロールしてより多くのセルを表示するように傾斜させるため)。 .

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

これを設定paging=YESすると、ページをフリックするにつれて増加するわずかなオフセットが生じます。これは、tableView が単一のセルよりもわずかに高く、セルの高さ/ページ サイズが揃っていないことが原因です。

ページングを有効にして、さまざまなことを試しました。tableView のサイズをセルの高さに設定しようとしましたが、クリッピングとマスキングをオフにして、ユーザーが次のセルを表示できるようにしました。次のセルは、セルが tableView の境界ボックスにスクロールする前の最後のミリ秒で下層の 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

4

3 に答える 3

11

開始オフセットに最も近いのではなく、 に最もscrollViewWillEndDragging:withVelocity:targetContentOffset:近いセルの上座標を返すように実装します。targetContentOffsetjjv360 が提供するソリューションはそれをうまく行いますが、セルの平均的な高さに応じて少し調整することをお勧めします (jjv360 のソリューションは、非常に大きなセルではきびきびしすぎる可能性があります)。

プロパティを変更することで、UITableViewの減速をより速くして、ページングのように動作させることができることを付け加えたいと思います (init/viewDidLoad/wherever で 1 回実行するだけです)。UIScrollViewdecelerationRate

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
于 2012-09-04T22:08:32.200 に答える
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;

}
于 2012-09-04T21:46:21.700 に答える
1

このコードでこの問題を解決しました:

- (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);
}

正しい方法を示してくれたhttp://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.htmlに感謝します。

于 2013-06-21T06:44:46.290 に答える