1. ホーム
  2. ios

オートレイアウト UIView-Encapsulated-Layout-WidthとHeightという名前の制約を作成するのは何ですか?

2023-08-09 05:05:41

質問

Interface Builderではレイアウトの制約は問題ないのですが、フレームワークの一部が、私が本当に望まない固定の高さと幅の制約を適用しているために、実行時に例外が発生します。なぜこのような制約があるのでしょうか、また、どのようにそれをオフにするのでしょうか。

ログに記録されたリストで最後に表示された2つの制約です。

2014-04-26 09:02:58.687 BBCNews[32058:60b] 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:0xbf478a0 UIView:0xbf4a3c0.height == 0.28125*UIView:0xbf4a3c0.width>",
    "<NSLayoutConstraint:0xbf47190 UIView:0xbf4a3c0.leading == BNMyNewsCell_landscape:0xbf48b10.leading>",
    "<NSLayoutConstraint:0xbf47160 UIView:0xbf4a3c0.trailing == BNMyNewsCell_landscape:0xbf48b10.trailing>",
    "<NSLayoutConstraint:0xbf47130 BNMyNewsCell_landscape:0xbf48b10.bottom == UIView:0xbf4a3c0.bottom>",
    "<NSLayoutConstraint:0xbf47100 UIView:0xbf4a3c0.top == BNMyNewsCell_landscape:0xbf48b10.top>",
    "<NSLayoutConstraint:0xd4c3c40 'UIView-Encapsulated-Layout-Width' H:[BNMyNewsCell_landscape:0xbf48b10(304)]>",
    "<NSLayoutConstraint:0xd4c38a0 'UIView-Encapsulated-Layout-Height' V:[BNMyNewsCell_landscape:0xbf48b10(290)]>"
}
Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0xbf478a0 UIView:0xbf4a3c0.height == 0.28125*UIView:0xbf4a3c0.width>

どのように解決するのですか?

たくさんの観察に基づき、私は以下の制約を確信しています。 UIView-Encapsulated-Layout-WidthUIView-Encapsulated-Layout-Height が作成されます。 UICollectionView とその仲間たちによって作成され sizeForItemAtIndexPath デリゲートメソッドによって返されるサイズを強制するために存在しています。を確実にするためにあるのでしょう。 UICollectionViewCell で設定された cellForItemAtIndexPath は、言われたとおりのサイズで終了します。

これが私の最初の質問の答えです。2つ目の質問は、なぜ制約が満たされなかったのか、ということです。セルの本質的な高さは、次のように同じであるべきでした。 UIView-Encapsulated-Layout-Height . これも確かなことではありませんが、丸め誤差ではないかと思います(つまり、固有の高さは200.1ピクセルになり、 が 200 に丸められたのかもしれません。私が思いついた修正は、関連するセル制約の優先順位を下げて UIView-Encapsulated-Layout-Height が最後の単語を持つようにすることです。