web-dev-qa-db-ja.com

スクロール後にUITableViewの現在の上部セルを検出する

簡単な質問ですが、Stackoverflowで検索するための適切な用語がないようです。

セクションのないUITableViewがあり、ユーザーはこのtableview内に表示されるデータ(行)の長いリストを上下にスクロールできます。

質問:ユーザーがスクロールした後に一番上のセル行番号を検出するにはどうすればよいですか? (たとえば、ユーザーが30セル下にスクロールしている場合、スクロール後の一番上のセルは30です)

38
chewy

UITableView-indexPathsForVisibleRowsまたは-indexPathForRowAtPoint

たとえば、テーブルのドラッグを停止したときに、表示されている一番上のセルのindexPathを印刷するとします。次のようなことができます:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
    NSLog(@"first visible cell's section: %i, row: %i", firstVisibleIndexPath.section, firstVisibleIndexPath.row);
}

Swift 3.0

let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0]
71
phi

表示行のインデックスパスを取得します

NSArray* indexPaths = [tableView indexPathsForVisibleRows];

次に、compare:を使用して並べ替えます

NSArray* sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)];

次に、最初の要素の行を取得します

NSInteger row = [(NSIndexPath*)[sortedIndexPaths objectAtIndex:0] row];
31
jbat100

これはSwift 3+コード:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0]
    print("First visible cell section=\(firstVisibleIndexPath?.section), and row=\(firstVisibleIndexPath?.row)")
}
8
mathema