[解決済み] 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);
もちろん、これはテーブルビューがスーパービューによって切り取られたり、他のビューによって隠されていることを考慮しません。
関連
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] Xcode 7のエラーです。"Missing iOS Distribution signing identity for ..." (iOS配布用署名IDがありません)
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] UITableView - トップにスクロールする
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
クラッシュエラー libc++abi.dylib: NSException 型のキャッチできない例外で終了_allanGold のブログ - ProgrammerITS401
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] 「GCC使用時に「Xcode/iOSのライセンスに同意するには管理者権限が必要です。rootでsudoを使用して再実行してください。
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み] ぼかしの入ったオーバーレイビューの作成