質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2377閲覧

UITableViewのscrollToRowのアニメーションが終了し、セルが画面に表示されてから、そのセルに対して操作をしたい。

mskRR

総合スコア6

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/06 14:19

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

スクロールが終了したら上記の delegate が呼び出されるようなので(一応試してみました)、こちらを試してみてはいかがでしょうか。

UIScrollView の delegate ですが、UITableView は UIScrollView を継承しているため、ViewController が UITableViewDeleagte に準拠しており、tableView.delegate = self などで移譲先のクラスを設定していれば、上記のメソッドは自動補完でも見えるようになっているかと思います。

以下、サンプルコード。

Swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 4 5 @IBOutlet weak var tableView: UITableView! 6 var data = [Int](1...50).map { String($0) } 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 tableView.dataSource = self 12 tableView.delegate = self 13 } 14 15 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 16 return data.count 17 } 18 19 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 20 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 21 cell.textLabel?.text = data[indexPath.row] 22 23 return cell 24 } 25 26 func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 27 print(#function) 28 } 29 30 @IBAction func backButton(_ sender: Any) { 31 let indexPath = IndexPath(row: 0, section: 0) 32 tableView.scrollToRow(at: indexPath, at: .top, animated: true) 33 } 34}

投稿2020/09/07 01:15

編集2020/09/07 06:35
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mskRR

2020/09/07 06:03

ありがとうございます。 どういう風に記述したらいいのでしょうか?
TsukubaDepot

2020/09/07 06:36

こちらで実証に使ったサンプルプログラムを追記しましたのでご確認ください。
mskRR

2020/09/07 12:21 編集

それは、インデックスパスや処理を実行するかどうかという情報をメンバに変数として持たせてから、スクロール終了時にそれらの情報をscrollViewDidEndScrollingAnimation内で読み込んで処理するということでしょうか?
TsukubaDepot

2020/09/07 12:59

最終的にどのようなことを実行されたいのかまでは把握していませんので何とも言えませんが、それも一つの方法だと思いますし、ほかの方法があるかもしれません。
mskRR

2020/09/07 13:35

ありがとうございます。
guest

0

自己解決

scrollToRowのアニメーションをfalseにして、UIView.animateメソッドでアニメーションさせると完了時が把握できるので、ネストが深くなりますが、一連の処理を同じ箇所で記述したいので下記方法で解決しようと思います。

swift

1let duration = 0.3 // 面倒ですが、スクロール量によって算出 2 3UIView.animate(withDuration: duration, animations: { 4    self.nameTableView.scrollToRow(at: destinationIndexPath, at: .middle, animated:false) 5}) { (finished) in 6 //ここで処理する 7}

投稿2020/09/07 13:35

mskRR

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問