2015-09-21 8 views
6

私のアプリでは、固定の比率(16x9)のカスタムtableViewCellがあります。これを実現するために、私はセルにビューを配置し、それを親ビューに固定しました(私はインターフェイスビルダーでそれを行いました:V/H:|-[innerView]-|)。 また、比率制約を付けました。iOS 9でUITableViewAutomaticDimensionが正しく機能しない

私のtableViewControllerでは、UITableViewAutomaticDimensionを表のセルの高さとして使用しています。

推定される行の高さは180ピクセルです(見てのとおり、セルが320ピクセルの幅のディスプレイに表示される正確なサイズです)。

すべてが正常に動作し、完璧に見えるが、私はまだ8.4のために配備するんだけど、iOSの9とデバイス上でプロジェクトを実行しているとき、私は自動レイアウトの警告のトンを取得しています。

警告自体は絶対に正しいです。私が望まない2つの制約があります - これらはiOSが独自に追加したものです。

2015-09-29 11:24:57.771 app[1039:324736] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x147d3e0d0 UIView:0x14901ff70.height == 0.5625*UIView:0x14901ff70.width>", 
    "<NSLayoutConstraint:0x147dd0210 H:|-(0)-[UIView:0x14901ff70] (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x147deeca0 V:|-(0)-[UIView:0x14901ff70] (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x149053c30 V:[UIView:0x14901ff70]-(0)-| (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x147dbc2b0 H:[UIView:0x14901ff70]-(0)-| (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x149070800 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x14901f960(179.5)]>", 
    "<NSLayoutConstraint:0x1490707b0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x14901f960(320)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x147d3e0d0 UIView:0x14901ff70.height == 0.5625*UIView:0x14901ff70.width> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

私がここで見るのは、iOSが何とか魔法のように減じた欠けている0.5ピクセルだけです。

+0

私がここに見るのは、iOSが何とか魔法のために減算した0.5ピクセルが欠けていることだけです。この情報はどこですか? – BangOperator

+0

@somexyzログに記録された制約を読んでください: 'V:[UITableViewCellContentView:0x14da0ff60(179.5)]' –

答えて

1

問題は、tableviewが自動的に追加する2つの制約です。 UIView-Encapsulated-Layout-高さと幅は、おそらく、その時のセルの制約に基づいて、初期ロード時にセルに対して計算されたテーブルビューの高さと幅です。

"<NSLayoutConstraint:0x149070800 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x14901f960(179.5)]>", 
"<NSLayoutConstraint:0x1490707b0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x14901f960(320)]>" 

これらの制約の優先順位は、あなたが何ができるか1000年であるためには、あなたの高さと幅の制​​約の優先順位を下げて(負荷時)、必要なときにカプセル化されたサイズが適用されるようにしましょうです。

+0

これは本当に助けになりました。タイミングについての短い説明(ロード)ありがとう。 iOS 8とiOS 9の違いについて教えてください。私は間違いなく、私は本当にiOSの9に自動レイアウトエンジンに変更されますが、これも同様のiOS 8で何が起こったのかわからない –

+0

.../iOS版9は違っそれをやっている理由だけ知りたい必要があります。 – Istvan

+0

はい。これは、この多かれ少なかれ汎用自動レイアウトの警告について話している限り、同様のiOS 8で起こっている可能性があります。私の場合、この警告はiOS9ではなく8で表示されるので、この質問を開きました。 –

1

2つの異なるビューに2つの比率制約を追加したようです。

が、ある

<NSLayoutConstraint:0x14d939e00 UIView:0x14da107f0.width == 
1.77778*UIView:0x14da107f0.height> 

がアドレス0x14da107f0でのUIViewに追加0x14d939e00メモリアドレスを持っていなければなりませんワン。

もう1つが壊れています。

<NSLayoutConstraint:0x14c5eae90 UIView:0x14c5ead30.height == 
    0.5625*UIView:0x14c5ead30.width> 

これはUIView(0x14c5ead30)に追加されます。このビューを探し、この比率制約を削除します。

+0

申し訳ありません、私は別のログの終わりに1の先頭を混ぜます。これは、アドレスと値の両方が合わない理由です。ただ1つの制約があり、iOS 8でうまくいくので、一般的な自動レイアウトの問題ではないと思います。 –

関連する問題