2

NSLayoutConstraints縦向きと横向きに使用したい視覚的な書式設定文字列を使用して構築された個別の配列があります。この 2 つを切り替えるには、2 つの方法を試しました。アクティブ化/非アクティブ化、および追加/削除です。

有効化/無効化:

portaitConstraints.forEach {
    $0.active = false
}
landscapeConstraints.forEach {
    $0.active = true
}

追加/削除:

self.view.removeConstraints(portraitConstraints)
self.view.addConstraints(landscapeConstraints)

どちらのメソッドも正常に動作し、期待どおりに動作しているように見えますが、アクティブ化/非アクティブ化メソッドで次のランタイム エラーが発生します。

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) 

これに共通するパターンはありますか?エラーが期待どおりに動作する場合、エラーを安全に無視できますか? 一方のメソッドと他方のメソッドのオーバーヘッドは異なりますか? ビューへの制約の追加とビューからの制約の削除を繰り返すよりも、アクティブにしたいプロパティの「アクティブな」プロパティを反転する方が理にかなっていると思いました。

それとも、これはこれを行うためのばかげた方法であり、NSLayoutAttributes直接変更するようなことをする必要がありますか?

4

2 に答える 2

1

おそらくレイアウトがあいまいで、いくつかの制約が互いに競合している可能性があります。translatesAutoresizingMaskIntoConstraints = NO通常、これは、制約を設定するビューを設定していない場合に発生します。コンソールは、競合する制約のリストを提供します。間違ったレイアウトにつながる可能性があるため、レイアウトのあいまいさを解決する必要があります。致命的ではありませんが、見栄えの良いアプリが必要な場合は、それを見る必要があります.

WWDC 2015 には、競合する制約をすばやく見つけて解決する方法を説明する素晴らしいビデオ、自動レイアウトの謎、パート 1自動レイアウトの謎、パート 2があります。これらは、自動レイアウト全体を理解するための優れたビデオでもあります。WWDC には、WWDC2012、Auto Layout by ExampleBest Practices for Mastering Auto LayoutTaking Control of Auto Layout in Xcode 5など、自動レイアウトに関する多くの情報をカバーするビデオがいくつかあります。

于 2015-09-06T17:13:03.207 に答える