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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

Q&A

解決済

1回答

3738閲覧

UITableViewのCellのなかのUIScrollViewが別のUIScrollViewと連動してしまっている感じがする

shota_e

総合スコア32

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

0グッド

1クリップ

投稿2017/06/29 07:45

編集2017/06/30 04:44

###実現したいこと
タイトルがまとまっていなくてすみません。

インスタグラムのようなタイムラインを作ってみようと思っています。
UITableViewを使用し、各Cellの中にUIScrollViewで作ったスライドショーみたいなものを設置して再現をしています。

タイムラインの構造

pull to refreshをすると先頭にcellが追加されてreloadData()されます。

###発生している問題

1. 一つ目のCellで2枚目の画像までスライドし、pull to refreshをすると新しいCellは追加されるのですが、
新しい方が2枚目までスライドされている状態で、2枚目までスライドした方は1枚目に戻ってしまいまう。
現象1

2. 複数Cellがある状態で一つ目のCellを2枚目の画像までスライドすると四つ目のCellでも2枚目までスライドされている。
Cellが四つ離れていると同じ現象が必ず起こる。
1つ目,4つ目
2つ目,5つ目
3つ目,6つ目
のような関係

###試したこと
UITableView + Cacheをつかってキャッシュしてみた。
今は使っていません。

###補足情報
・ Swift3
・ CellはカスタムCellを使っています
・ 画像はSDWebImageでキャッシュしています

###解決?

swift

1 var imagePageCount:Dictionary<Int, CGFloat> = [:] 2 var imageScrollView:Dictionary<Int, CGRect> = [:] 3 4 internal func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell { 5 print("セルを作った") 6 let cell: TimelineCell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell", for: indexPath as IndexPath) as! TimelineCell 7 8 cell.setCell(timeline: timelineData[indexPath.row]) 9 10 if (imageScrollViewData[indexPath.row] != nil) { 11 cell.imageScrollView.contentOffset.x = imagePageCount[indexPath.row]! 12 cell.imageScrollView.frame = imageScrollView:Dictionary[indexPath.row]! 13 } 14 15 return cell 16 } 17 18 func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 19 print("画面外にでた") 20 let cell: TimelineCell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell", for: indexPath as IndexPath) as! TimelineCell 21 imagePageCount[indexPath.row] = cell.imageScrollView.contentOffset.x 22 imageScrollView:Dictionary[indexPath.row] = cell.imageScrollView.frame 23 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

セルの再利用を考慮していないのでは?

セルが画面から消えるときのScrollViewのスクロール位置を記憶しておいて、再び画面に現れるときに記憶しておいたスクロール位置を設定してやらないといけません。

投稿2017/06/29 08:08

fuzzball

総合スコア16731

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

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

shota_e

2017/06/30 04:49

セルの再利用、いろいろ調べてみて 動くところまで行きました。 ありがとうございます。 質問文の「解決?」のところに動いたコードを追加しました。 cellが画面外にでた時に、スクロール量と現在のページのカウントを保存し、再度表示された時に「IndexPath」を使って設定し直すようにしました。 ただ、Dictionaryを使って保存しているからか、スクロールする時にカクカクしてしまいます。 この方法より、もっと良い方法がありましたら教えていただけませんか? よろしくお願いいたします。
fuzzball

2017/06/30 04:51 編集

cellは引数で渡されたものを使って下さい。(let cell: TimelineCell = ... の行を削除)
fuzzball

2017/06/30 04:58

もう一つ。保存/復元するのはframeではなくcontentOffsetではないですか?
shota_e

2017/06/30 05:32

ありがとうございます!!!! 「cellは引数で渡されたもの」渡していたこと忘れていました...。 fuzzballさんのおかげで無事解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問