web-dev-qa-db-ja.com

「UIView-Encapsulated-Layout-Width」制約とは何ですか?

「制約を同時に満たすことができません」という例外(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'部分はこれと関係があるのでしょうか?

47
Goodsquirrel

すばやく簡単に修正するには、999優先度の高いカスタム制約の優先度値。カプセル化された自動生成された制約は、制約よりも高い優先度で優位に立つはずです。

https://stackoverflow.com/a/25795758/59001

15
DZenBot

サンプルで遊んだのですが、これらのコードが自動レイアウト例外を引き起こしていると思います。

CSStickyHeaderFlowLayout.mのCGFloat height = MAX(0, -y + maxY);行79。

200のような高さに静的な値を使用すると、例外は発生しなくなります。 UIView-Encapsulated-Layoutが何であるかを正確に理解することはできませんが、UICollectionViewLayoutAttributesフレームを動的に変更するとその問題が発生する可能性があります。サンプルプロジェクトでは、高さ、POの問題では、幅だと思います。あなたがそれが役立つと思うなら、もう少し掘り下げることができます

3
Xu Yin

これは、テーブル行ではなく通常のビューとしてUITableViewCellサブクラスを使用していたiOS 10ビルドでこれを見つけました。セルはcontentViewの幅をゼロに制限していました。

私が使用した回避策は、tableviewセルの代わりにcontentViewをビュー階層に追加するだけでした。また、tableViewセルを保持することも確認しました(ビュー階層自体によって保持されなくなったため)。

1
Joseph Lord

私の状況

私にとっては、プログラム上の制約が機能するはずだということを(論理的に)知っていました。デバイスの回転後にそれらを更新していました。

制約を変更せずにすばやく簡単に解決できるのは、これがすべてメインスレッドで行われるようにすることでした。どうして?確かではありませんが、回転の更新は非同期スレッドで行われる必要があると思います。

修正方法

から:

topTitleLeadingAnchorLandscape.isActive = true

に:

DispatchQueue.main.async {
    self.topTitleLeadingAnchorLandscape.isActive = true
}

これにより、誰かが将来多くの時間を節約できることを願っています! ????

1
George_E

質問への答えに光を当てることができます。私のOS Xアプリでは、NSTableViewのセルビュー(つまり、NSTableViewDelegateのメソッド-tableView:viewForTableColumn:rowで以前に返されたオブジェクト)にこのような神秘的な制約を見つけました。また、この同じテーブル列にsetWidth:0.0メッセージを送信しました。そのsetWidth:のパラメーターを0.0から他の値に変更すると、不思議な制約の定数値に反映されました。

結論:「UIView-Encapsulated-Layout-Width」または「NSView-Encapsulated-Layout-Width」でログを記録する制約は、テーブル列の幅などを設定することにより発生します。

0
Jerry Krinock