問題タブ [uitableviewautomaticdimension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
1287 参照

ios - iOS 11 UITableView の自動 sectionHeaderHeight のバグにより、アニメーションの不具合が発生し、テーブルビューの上に壊れたセクションが残る可能性があります

最新のアプリを開発しているときに、テーブルビューのセルに各セクションに収まる十分なスペースが与えられていないように見えるテーブルビューでレンダリングの問題が発生することがありました。

最近まで問題を確実に再現するのに苦労していましたが、考えられるすべてを使い果たした後、バグの基本をテストアプリに複製することに決め、最終的に同様の問題を再現することができたので、最終的にはバグの原因になります。

私のメイン アプリはカスタム セクション ヘッダー ビューを使用し、必要に応じて複数行に拡張できるテキストを含む動的コンテンツを含めるため、自動高さディメンション行とセクション ヘッダーを必要とします。メインアプリで問題をデバッグするとき、カスタムセクションヘッダービューをデフォルトのテーブルビューセクションタイトルに置き換えてみましたが、それでも問題を再現できたので、このテストアプリはセクションタイトルを自動 sectionHeaderHeights で使用していますが、これは奇妙だと気づきましたが、同じ問題はカスタム ビューで発生します。単純なタイトルを使用すると、より単純な例になります。

ここにある zip ファイルにプロジェクトのコピーをアップロードしました。

私のテストアプリのワークフローが正常に動作し、自動 sectionHeaderHeight によって壊れていることを示す 2 つのビデオも同様です。これらの動画はこちら

次の画像は、2 つのテスト セクションとその行を正しく表示するアプリの動作の違いを示しています。

作業中のスクリーンショット

そして、セクション 2 内の行の 1 つを塞いでいるフローティング「セクション 2」ヘッダーで壊れています。

壊れたスクリーンショット

これに実際に関連するコードは、プロジェクトの TableViewController 内にあります。

クラス定数 setAutomaticDimensionSectionHeaderHeight を設定して、tableView.sectionHeaderHeight を UITableViewAutomaticDimension に初期化するかどうかを設定できることがわかります。自動に設定すると、上記のビデオに示されているようなバグが発生します。

  • バーボタンを使用してセクションを視覚的に切り替える場合
    • 新しい「セクション 2」ヘッダーが目的の位置にすぐに表示されます
    • 既存の「セクション 2」ヘッダーとその行はすべて、正しい位置にスライドします
  • 非表示のセクションを切り替える場合
    • (テーブル行を選択して) 次のビュー コントローラーに移動し、そのテーブルビュー セクションの切り替えボタンを使用する
    • テーブルビューに戻ります
    • テーブルビューがオフスクリーンである間、セクション1とその行を非表示にするようにこれを繰り返します
      • セクション 1 が追加されたときの位置に、ダミーの「セクション 2」ヘッダーが浮いていることがわかります。
      • このダミー ヘッダーはテーブルビューに添付され、それと共にスクロールしますが、ビューの一番上までスクロールしたときに他の実際のセクション ヘッダーを邪魔にならないようにすることはありません。

アニメーションの不具合は、このテスト アプリ内でのみ気付いたものです。私のメイン アプリでは、ナビゲーション コントローラーの子ビューで常にテーブル ビューのオフスクリーンへの変更を再現します。説明したように、フローティング ヘッダー ビューが発見されており、アプリがかなり壊れているように見え、実際にはいくつかのテーブルビュー行を非表示にすることでかなり壊れています。最初に見たとき、ヘッダーが間違っていてフローティングしていることに気づきませんでした。テーブルビューの他の問題だと思いました。

かなり壊れているように見えるので、おそらくこれについてAppleにレーダーを記録しますが、誰かが何かアイデアを持っているかどうか見てみようと思いました. 自動セクションの高さに関する一般的な問題について話し、セクションの高さのサイズを動的に計算することを推奨する人がいるのを見てきました。この時点で自動レイアウトが解決されたと信頼できる場合は、これを試すことができると思います私のsectionView内のコンポーネントビューの高さを合計すると思いますか?

それ以外に、次のような他の質問/回答シリーズを見たばかりです

おそらく、推定セクションヘッダー高さ(および推定行高さ)を0に設定しようとしているという話ですが、これはテストアプリで試したところ、問題を「修正」しているようです。後者のリンクは、初期の iOS 11 リリース ノートも引用しています。

テーブル ビューはデフォルトで推定高さを使用するようになりました。これは、セルとセクション ヘッダー/フッター ビューがデフォルトで自動サイズ調整されることも意味します。EstimatedRowHeight、estimatedSectionHeaderHeight、および EstimatedSectionFooterHeight プロパティのデフォルト値が UITableViewAutomaticDimension になりました。これは、テーブル ビューが使用する推定高さを選択することを意味します。可能であれば、各プロパティのより正確な見積もりを提供する必要があります。これは、実際の高さの平均値の最良の推測です。iOS 11 SDK を使用してアプリをビルドするときに異なる動作をする既存のテーブル ビュー コードがあり、セルフ サイズ設定を採用したくない場合は、値をゼロに設定して推定高さを無効にすることで、以前の動作を復元できます。各推定高さプロパティ。(30197915)

そのため、estimatedSectionHeaderHeight 行をすべてコメントアウトして、新しいデフォルトの iOS 11 の動作を使用しようとしました。これも問題なく機能しているようで、セルフサイジングが必要であることを知っているので、その説明により、より好ましいように聞こえます. ただし、メモには、見積もりを自分で提供する必要があると書かれていますが、それを行うとこれらのバグにつながるため、この段階ではアップルからの悪いアドバイスのようです.

メインアプリを再び通常の状態に戻し、これで問題が解決するかどうかを確認する必要があります。最初に動的な高さのセクションと行を機能させたとき、必要なスペースを埋めるために自動レイアウトと複数行のテキスト ラベルを実際に適切に機能させるには、これらの推定プロパティを何かに設定する必要があるように思われたことを覚えています (私は間違っていた可能性があります)。ただし、物事を機能させようとしてすべてのパラメーターと格闘していたので)。これを 0 に設定するのは間違っているように思われますが、これらのセクションの推定サイズが通常どのくらいになるかを把握できる場合は、空白のままにしてデフォルトの自己サイジングを採用するのが正しいようですが、以前の iOS でリリースした場合はおそらくうまく機能しないので、コードを微調整する必要があるかもしれません。

これに関するこれ以上のアイデアは本当にありがたいです!

乾杯!

編集

さらにテストすると、高さと推定高さを0に設定して物事を修正することに楽観的すぎたようです。メインアプリのユースケースに適合しない動的な高さセクションヘッダーを持たないことによってのみ問題を解決できます

さまざまなオプションのすべての組み合わせを調べてテストし、次の結果を得ました

sectionHeaderHeight の観点から、別の EstimationHeaderHeights を使用

  • tableView.sectionHeaderHeight = 0
    • 推定高さ == 0、45、または自動寸法のヘッダーはありません
  • tableView.sectionHeaderHeight = 60
    • ヘッダーはすべて一定の高さ 60 で、UI バグはありません
  • tableView.sectionHeaderHeight = UITableViewAutomaticDimension
    • ヘッダーなし、または推定ヘッダー高さが 0 の場合は viewForHeaderCalled
    • ヘッダーの推定高さが数値または自動寸法に設定されている場合、バグのあるヘッダー

異なる sectionHeaderHeights を持つ推定 sectionHeaderHeight パースペクティブから

  • tableView.estimatedSectionHeaderHeight = 0
    • sectionHeaderHeight が 0 に設定されたヘッダーがないか、viewForHeader が呼び出されない自動ディメンション。
    • ヘッダー headerHeight=60 のバグはありません
  • tableView.estimatedSectionHeaderHeight = 45
    • sectionHeaderHeight == 0 のヘッダーはありません
    • sectionHeaderHeight=60 のバグなしでヘッダーを 60 に固定
    • sectionHeaderHeight==Automatic Dimension のバグによるヘッダーの自動サイズ変更
  • tableView.estimatedSectionHeaderHeight = UITableViewAutomaticDimension
    • sectionHeaderHeight==0 の場合、バグのあるヘッダー、自動寸法
    • sectionHeaderHeight=60 のバグなしでヘッダーを 60 に修正

基本的に、この問題を修正する組み合わせはありませんが、動的な高さのセクション ヘッダーを持つ機能は保持されます