IOS8 の自動レイアウトに問題があります。再現できる最も単純なケースは、単純なテーブルビューです。静的セルを設定し、ラベルを追加するだけです。
私の目標は、ラベルがスペースの大部分を占めるようにすることなので、ラベルには 3 つの制約があります...
- スーパービュー内で垂直に中央に配置します(これで問題ないと思います)
- ラベルの末尾の余白を 30 に設定します (スーパービューを基準)
- ラベルの先頭余白を 30 に設定します (スーパービューを基準)
すべて問題なく、大きな問題や警告もなく完璧に動作します (高さがゼロであることについては警告が出ますが、これはそれほど問題ではないと思います)
さて...開示インジケーターを追加すると、すべてが崩壊します。まだ問題ないように見えますが、次のようになります。
2014-10-30 15:51:46.358 ContraintIssue[25572:1586028] 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:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>",
"<NSLayoutConstraint:0x7fd3f3d235f0 UILabel:0x7fd3f3d227e0'Label'.leading == UITableViewCellContentView:0x7fd3f3d226f0.leadingMargin + 30>",
"<NSLayoutConstraint:0x7fd3f53b73b0 'fittingSizeHTarget' H:[UITableViewCellContentView:0x7fd3f3d226f0(38)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>
インジケータを追加するとなぜこのような問題が発生するのか理解できません。これは数字のスケールとは関係ありません。私はかなり実験しました。
何か案は?
実際の例では、ラベル (ラベル) を持つセルがあり、その後に別のラベルまたはテキスト ビューがあり、そのラベルには開示に従って設定できる値が含まれています。したがって、最初のラベルは固定サイズで、2 番目のラベルは理想的には最大サイズにする必要がありますが、必要に応じてテキストを切り捨てます。
(私が実現しようとしていることの例については、連絡先の追加内の「着信音」または「バイブレーション設定」を参照してください)
どうもありがとう、
リー。
ベストアンサー1
私も同じ問題を抱えていました。左側にイメージ ビューをレイアウトし、その右側にラベルを配置して、イメージ ビューとスーパー ビュー (セルのコンテンツ ビュー) の右 (または末尾) 境界の間のスペースを埋めたいと考えています。アクセサリ ビューも開示インジケーターに設定されています。あなたの場合と同様に、競合する制約はすべて H ベースで、ログで見つかった制約の 1 つは でしたfittingSizeHTarget
。これが何を意味するのか、どこから来ているのかはわかりませんでしたが、ここであなたの投稿を見つけました。
私の場合は次の方法が効果的でした:
ラベルの末尾からスーパービューへの制約の優先度を下げます。(私は 990 を選択しました)。
レイアウト システム (開示インジケーターが表示されている) は、何らかの理由ですべての制約を満たすことができなくなり、制約の 1 つが破られると想定しています。ただし、優先度を下げると、制約を満たそうとしますが、競合する制約の方が優先度が高いため、制約は破られません。
これであなたの問題も解決することを願っています。