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

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

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

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

Q&A

0回答

1886閲覧

tableViewのcontentOffsetを変更してスクロールさせた場合のiOS12とiOS13での挙動の違いについて

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2019/10/22 00:27

編集2019/10/22 05:41

tableViewのセルをボタンタップで追加しているのですが、iOS12iOS13で違う動作をしてしまいます。直す方法などご存知でしたら教えて下さい。

cellを追加するスペースがない場合はcontentOffsetをいじってtableViewをセルの高さ分スクロールさせてからセルを追加しています。
連続してセルを追加する場合、iOS12の場合は、contentOffset.yが意図したとおりに増加していきますが、iOS13の場合は1度しか増加せず、よって一度しか意図したとおりにスクロールしません。

contentOffsetをいじった場合の挙動が違うようですが、プログラムから変更させたcontentOffsetを定着?リフレッシュ??させるようなメソッドなどあるのでしょうか?

Xcode var 11.1
-simulator-
iOS 12.1 iPhone Xs Max
iOS 13.1 iPhone 11 Pro Max

↓iOS12.1:希望する動きになっている
iOS12.1
↓iOS13.1:スクロールが変…
iOS13.1

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 4 5 @IBOutlet weak var tTableView: UITableView! 6 7 var array: [Int] = [1, 2, 3, 4, 5, 6] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view. 12 tTableView.tableFooterView = UIView(frame: .zero) 13 tTableView.estimatedRowHeight = 40 14 } 15 16 // セルを追加する(必要があればtableViewをスクロールする) 17 @IBAction func addCellBtnDidTap(_ sender: Any) { 18 19 // 追加するセルの直上のセルのインデックスパスを取得 20 let lastCellIndexPath = IndexPath(row: array.count - 1, section: 0) 21 // データ追加 22 array.append(array.count + 1) 23 // 追加したセルのインデックスパスを取得 24 let addCellIndexPath = IndexPath(row: array.count - 1, section: 0) 25 // 追加するセルの直上のセルのMaxYをself.view系に変換して取得 26 let lastCellMaxY 27 = tTableView.convert(tTableView.rectForRow(at: lastCellIndexPath), to: self.view).maxY 28 29 // tableViewのmaxYを取得 30 let tTableViewMaxY = tTableView.frame.maxY 31 32 // addCellを挿入するスペースがない場合の処理 33 if lastCellMaxY + 40 > tTableViewMaxY { 34 35 // スクロール量を求める 36 let offsetY: CGFloat = 40 - (tTableViewMaxY - lastCellMaxY) + 0.5 37 38 // ログを下に貼っておきます 39 print("------------------------------------------------") 40 print("### offsetY:", offsetY) 41 print("### before tTableView.contentOffset.y:", tTableView.contentOffset.y) 42 43 //// スクロール完了後にセルを追加する 44 UIView.animate(withDuration: 0.6, animations: { 45 self.tTableView.contentOffset.y += offsetY // <= 一度しか加算されない 46 }){(finished) in 47 print("### after tTableView.contentOffset.y:", self.tTableView.contentOffset.y) 48 self.tTableView.insertRows(at: [addCellIndexPath], with: .right) 49 50 } 51 // addCellを挿入するスペースがある場合の処理 52 } else { 53 // セルを追加する 54 tTableView.insertRows(at: [addCellIndexPath], with: .right) 55 } 56 } 57 58 // numOfCell 59 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 60 return array.count 61 } 62 63 // generateCell 64 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 65 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 66 cell.textLabel?.text = String(array[indexPath.row]) 67 return cell 68 } 69 70 // heightForCell 71 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 72 return 40 73 } 74 75} 76 77 78/* 79ios12.1 contentOffsetYが増加していく スクロールさせる値のoffsetYは一定。 80------------------------------------------------ 81### offsetY: 35.16666666666663 82### before tTableView.contentOffset.y: 0.0 83### after tTableView.contentOffset.y: 35.0 84------------------------------------------------ 85### offsetY: 40.5 86### before tTableView.contentOffset.y: 34.666666666666664 87### after tTableView.contentOffset.y: 75.0 88------------------------------------------------ 89### offsetY: 40.49999999999994 90### before tTableView.contentOffset.y: 74.66666666666667 91### after tTableView.contentOffset.y: 115.0 92------------------------------------------------ 93### offsetY: 40.49999999999994 94### before tTableView.contentOffset.y: 114.66666666666667 95### after tTableView.contentOffset.y: 155.0 96------------------------------------------------ 97### offsetY: 40.5 98### before tTableView.contentOffset.y: 154.66666666666666 99### after tTableView.contentOffset.y: 195.0 100------------------------------------------------ 101### offsetY: 40.5 102### before tTableView.contentOffset.y: 194.66666666666666 103### after tTableView.contentOffset.y: 235.0 104------------------------------------------------ 105### offsetY: 40.5 106### before tTableView.contentOffset.y: 234.66666666666666 107### after tTableView.contentOffset.y: 275.0 108------------------------------------------------ 109### offsetY: 40.49999999999994 110### before tTableView.contentOffset.y: 274.6666666666667 111### after tTableView.contentOffset.y: 315.0 112 113 114iOS 13.1 contentOffset.yが一度しか増加せず、そのためスクロールさせる値のoffsetYが増加していく。 115------------------------------------------------ 116### offsetY: 35.16666666666663 117### before tTableView.contentOffset.y: 0.0 118### after tTableView.contentOffset.y: 35.0 119------------------------------------------------ 120### offsetY: 40.5 121### before tTableView.contentOffset.y: 34.666666666666664 122### after tTableView.contentOffset.y: 34.666666666666664 123------------------------------------------------ 124### offsetY: 80.5 125### before tTableView.contentOffset.y: 34.666666666666664 126### after tTableView.contentOffset.y: 34.666666666666664 127------------------------------------------------ 128### offsetY: 120.5 129### before tTableView.contentOffset.y: 34.666666666666664 130### after tTableView.contentOffset.y: 34.666666666666664 131------------------------------------------------ 132### offsetY: 160.5 133### before tTableView.contentOffset.y: 34.666666666666664 134### after tTableView.contentOffset.y: 34.666666666666664 135------------------------------------------------ 136### offsetY: 200.5 137### before tTableView.contentOffset.y: 34.666666666666664 138### after tTableView.contentOffset.y: 34.666666666666664 139------------------------------------------------ 140### offsetY: 240.5 141### before tTableView.contentOffset.y: 34.666666666666664 142### after tTableView.contentOffset.y: 34.666666666666664 143 144 145*/ 146 147

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問