1. ホーム
  2. ios

[解決済み] UITableViewCellが完全に表示されているかどうかを確認する最良の方法

2022-11-05 10:45:41

質問

異なる高さのセルを持つUITableViewがありますが、これらのセルがいつ 完全に 表示されているかどうかを知る必要があります。

現時点では、ビューがスクロールされるたびに、完全に表示されているかどうかを確認するために、表示されているセルのリスト内の各セルをループしています。これは最良の方法でしょうか?

以下は私のコードです。

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {

    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;    
    NSArray* cells = myTableView.visibleCells;

    for (MyCustomUITableViewCell* cell in cells) {

        if (cell.frame.origin.y > offset.y &&
            cell.frame.origin.y + cell.frame.size.height < offset.y + bounds.size.height) {

            [cell notifyCompletelyVisible];
        }
        else {

            [cell notifyNotCompletelyVisible];
        }
    }
}

編集します。

なお、*- (NSArray )可視セル は、完全に見えるセルと部分的に見えるセルの両方を返す。

2を編集します。

これは、両者の解決策を組み合わせて修正したコードです。 lnafziger Vadim Yelagin :

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    NSArray* cells = myTableView.visibleCells;
    NSArray* indexPaths = myTableView.indexPathsForVisibleRows;

    NSUInteger cellCount = [cells count];

    if (cellCount == 0) return;

    // Check the visibility of the first cell
    [self checkVisibilityOfCell:[cells objectAtIndex:0] forIndexPath:[indexPaths objectAtIndex:0]];

    if (cellCount == 1) return;

    // Check the visibility of the last cell
    [self checkVisibilityOfCell:[cells lastObject] forIndexPath:[indexPaths lastObject]];

    if (cellCount == 2) return;

    // All of the rest of the cells are visible: Loop through the 2nd through n-1 cells
    for (NSUInteger i = 1; i < cellCount - 1; i++)
        [[cells objectAtIndex:i] notifyCellVisibleWithIsCompletelyVisible:YES];
}

- (void)checkVisibilityOfCell:(MultiQuestionTableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath {
    CGRect cellRect = [myTableView rectForRowAtIndexPath:indexPath];
    cellRect = [myTableView convertRect:cellRect toView:myTableView.superview];
    BOOL completelyVisible = CGRectContainsRect(myTableView.frame, cellRect);

    [cell notifyCellVisibleWithIsCompletelyVisible:completelyVisible];
}

どのように解決するのですか?

セルの矩形を取得するには rectForRowAtIndexPath: メソッドで取得し、それをテーブルビューの境界の矩形と比較するには CGRectContainsRect 関数を使って比較します。

これは、セルが表示されていない場合はインスタンス化しないので、かなり高速になることに注意してください。

スウィフト

let cellRect = tableView.rectForRowAtIndexPath(indexPath)
let completelyVisible = tableView.bounds.contains(cellRect)

オブジェC

CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];
BOOL completelyVisible = CGRectContainsRect(tableView.bounds, cellRect);

もちろん、これはテーブルビューがスーパービューによって切り取られたり、他のビューによって隠されていることを考慮しません。