UITableViewのscrollToRowのアニメーションが終了し、セルが画面に表示されてから、そのセルに対して操作をしたいのですが、セルが画面上に表示されるまで待って処理する方法などありますか?
メインスレッドへの処理の追加、UIView.Animateでのスクロールアニメーション処理の終了検知(completion)、などをためしたのですが、いずれの方法も該当セルがvisibleCellsに入っていない状態で
処理をかけてしまい、動作しません。
async.afterなどの遅延処理でできるかもしれませんが、スクロール量(セルの数)が一定ではないので、遅延させる時間が把握できないのでなんとも。
swift
1 2@IBOutlet weak var nameTableView: UITableView! 3 4// 引数で渡しているのは最終行のセルのindexPathで画面に表示されていないので該当箇所までスクロールさせてから処理をしたい。 5func reloadAndEnhanceCell(indexPath: IndexPath) { 6 7 // リロード前に選択されていたセルのインデックスパスを退避する 8 let indexPath = nameTableView.indexPathForSelectedRow 9 10 // UIViewのanimationメソッドでreload終了を検知、終了まで待機する。 11 UIView.animate(withDuration: .zero, animations: { 12 self.nameTableView.reloadData() 13 }) { (finished) in 14 // 選択されていたセルを再選択する 15 self.nameTableView.selectRow(at: sourceIndexPath, animated: false, scrollPosition: .none) 16 // 最終行までスクロールして最終行のセルを強調表示する 17 self.nameTableView.scrollToRow(at: destinationIndexPath, at: .middle, animated: true) 18 19 // 最終行のセル(indexPath)はこの段階ではvisibleCellsに入ってきていないのでnilになり処理ができない 20 let cell = nameTableView.tableView.cellForRow(at: indexPath) as? DetailCell 21 cell?.enhance() //<- カスタムセル内で定義したこの処理を実行したい 22 23 24 })
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/07 06:03
2020/09/07 06:36
2020/09/07 12:21 編集
2020/09/07 12:59
2020/09/07 13:35