「制約を同時に満たすことができません」という例外(Xcode 5、iOS 7、デバイスとシミュレーターの両方)を取得し続けます。リストの制約の1つは次のようなものです。
"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"
私はこの制約を自分で設定しませんでした。 NSAutoresizingMaskLayoutConstraint
でもありません。しかし、それはどこから来たのでしょうか?そして、どうすればそれを取り除くことができますか?
何も思いつきません。そして、Appleのドキュメントには'UIView-Encapsulated-Layout-Width'
について何も見つかりません。 Google検索でさえ、何も返されません。
助言がありますか?
PS:UICollectionView
のカスタムサブクラスを持つUICollectionViewFlowLayout
でこのセルを使用しています。おそらく'Encapsulated-Layout'
部分はこれと関係があるのでしょうか?
すばやく簡単に修正するには、999
優先度の高いカスタム制約の優先度値。カプセル化された自動生成された制約は、制約よりも高い優先度で優位に立つはずです。
サンプルで遊んだのですが、これらのコードが自動レイアウト例外を引き起こしていると思います。
CSStickyHeaderFlowLayout.mのCGFloat height = MAX(0, -y + maxY);
行79。
200のような高さに静的な値を使用すると、例外は発生しなくなります。 UIView-Encapsulated-Layoutが何であるかを正確に理解することはできませんが、UICollectionViewLayoutAttributesフレームを動的に変更するとその問題が発生する可能性があります。サンプルプロジェクトでは、高さ、POの問題では、幅だと思います。あなたがそれが役立つと思うなら、もう少し掘り下げることができます
これは、テーブル行ではなく通常のビューとしてUITableViewCellサブクラスを使用していたiOS 10ビルドでこれを見つけました。セルはcontentViewの幅をゼロに制限していました。
私が使用した回避策は、tableviewセルの代わりにcontentViewをビュー階層に追加するだけでした。また、tableViewセルを保持することも確認しました(ビュー階層自体によって保持されなくなったため)。
私にとっては、プログラム上の制約が機能するはずだということを(論理的に)知っていました。デバイスの回転後にそれらを更新していました。
制約を変更せずにすばやく簡単に解決できるのは、これがすべてメインスレッドで行われるようにすることでした。どうして?確かではありませんが、回転の更新は非同期スレッドで行われる必要があると思います。
から:
topTitleLeadingAnchorLandscape.isActive = true
に:
DispatchQueue.main.async {
self.topTitleLeadingAnchorLandscape.isActive = true
}
これにより、誰かが将来多くの時間を節約できることを願っています! ????
質問への答えに光を当てることができます。私のOS Xアプリでは、NSTableViewのセルビュー(つまり、NSTableViewDelegateのメソッド-tableView:viewForTableColumn:rowで以前に返されたオブジェクト)にこのような神秘的な制約を見つけました。また、この同じテーブル列にsetWidth:0.0メッセージを送信しました。そのsetWidth:のパラメーターを0.0から他の値に変更すると、不思議な制約の定数値に反映されました。
結論:「UIView-Encapsulated-Layout-Width」または「NSView-Encapsulated-Layout-Width」でログを記録する制約は、テーブル列の幅などを設定することにより発生します。