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

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

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

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

解決済

カスタムテーブルビューセルの高さを WKWebView のコンテンツの高さに応じて決めたい。

ringotubame
ringotubame

総合スコア21

Swift

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

1回答

0評価

0クリップ

362閲覧

投稿2022/01/19 18:19

カスタムテーブルビューセルの高さをこのセルに埋めた WKWebView のコンテンツの高さに応じて決めたい。

テーブルビューを設置した ViewController は下記のような感じ

セル1
セル2
webCell

tableView は四方に 0 0 0 0 の autolayout による制約付き。

html 読み込み後に、
webCell.webViewHeightConstraint?.constant = height as! CGFloat
として高さを更新しているつもりなのになぜか webCell の高さがかわらない。
高さは初期値の 400 のまま

現状
イメージ説明

// エラーメッセージ
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x60000129f1b0 WKWebView:0x13c021800.height == 656 (active)>",
"<NSLayoutConstraint:0x600001284190 V:[WKWebView:0x13c021800]-(0)-| (active, names: '|':UITableViewCellContentView:0x13ad83730 )>",
"<NSLayoutConstraint:0x600001284a00 V:|-(0)-[WKWebView:0x13c021800] (active, names: '|':UITableViewCellContentView:0x13ad83730 )>",
"<NSLayoutConstraint:0x60000129ec10 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x13ad83730.height == 400.5 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60000129f1b0 WKWebView:0x13c021800.height == 656 (active)>

自動で高さが更新されないので webView:didFinish navigation:メソッド内でテーブルビューセルを reload すると無限ループでこまってます。
セルの高さを webView の高さ 656 にしたいのに勝手に break されて 400 になってる。
400 は .xib で設定した初期値。これが更新したつもりが更新できてない。

swift

// テーブルビューを設置した ViewController側 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: "myCell1", for: indexPath) switch indexPath.row { case 2: print("webCell") let webCell = tableView.dequeueReusableCell(withIdentifier: "webCell", for: indexPath) as! MYWebTableViewCell webCell.myWebView.navigationDelegate = self webCell.loadHTMLContent(htmlContent: htmlStr) return webCell default: print("case default: ") cell = tableView.dequeueReusableCell(withIdentifier: "myCell1", for: indexPath) } return cell } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler: { [self] (height, error) in let webCell = myTableView.cellForRow(at: IndexPath(row: 2, section: 0)) as! MYWebTableViewCell webCell.webViewHeightConstraint?.constant = height as! CGFloat print(webCell.webViewHeightConstraint?.constant) // Optional(656.0) print("webView.frame : ", webView.frame) // (0.0, 0.0, 320.0, 400.5) // myTableView.reloadRows(at: [IndexPath(row: 2, section: 0)], with: .none) // webCell.layoutIfNeeded() // self.superview?.layoutIfNeeded() }) }

swift

class MYWebTableViewCell: UITableViewCell{ @IBOutlet weak var myWebView: WKWebView! @IBOutlet weak var webViewHeightConstraint: NSLayoutConstraint! override func awakeFromNib() { super.awakeFromNib() print("webViewHeightConstraint : ", webViewHeightConstraint) myWebView.scrollView.isScrollEnabled = false }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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