はい、これは可能です。
ビューの を設定するとtranslatesAutoresizingMaskIntoConstraints = YES
、 への呼び出しsetFrame:
は実行時に、ビューの現在の に基づいてレイアウト制約に自動的に変換されますautoresizingMask
。これにより、フレームベースのレイアウトと制約ベースのレイアウトを組み合わせることができます。
たとえば、自動レイアウトを使用してビューのすべてのサブビューのレイアウトを定義できますがsetFrame:
、ビュー自体のサイズと位置を設定するために呼び出します。あなたの観点からは、自動レイアウトと直接フレーム操作を組み合わせてレイアウトを行っています。しかし、システムは実際には制約を使用してすべてを処理しています。
ただし、 を使用する際には 1 つの大きな注意点がありtranslatesAutoresizingMaskIntoConstraints
ます。
これを行う場合でも、これらの自動制約が残りの制約で満たされることを確認する必要があります。
たとえば、ビューのサイズと位置を決定する制約が既に存在し、さらに を設定しtranslatesAutoresizingMaskIntoConstraints = YES
て呼び出したとしsetFrame:
ます。を呼び出すとsetFrame:
、ビューに新しい制約が生成されます。これは、既存の制約と競合する可能性があります。
(実際、このエラーは頻繁に発生します。競合する制約に関するログ メッセージが表示され、それらの制約の 1 つが である場合、表示さNSAutoresizingMaskLayoutConstraint
れているのは自動制約との競合です。これは簡単な間違いです。なぜなら、translatesAutoresizingMaskIntoConstraints = YES
はデフォルト値であるため、コードで制約を構成している場合、これらの自動制約が必要ない場合は忘れずにオフにする必要があります)。
対照的に、ビューのサイズと位置を決定する制約が既に存在しているが、translatesAutoresizingMaskIntoConstraints = NO
を呼び出す前に設定したとしますsetFrame:
。この場合、setFrame:
呼び出しによって新しい制約が生成されないため、個別の制約間の競合は発生しません。ただし、この場合、コンストレイントと設定したフレーム値の間にはまだ「矛盾」があります。次に自動レイアウトが呼び出されると、ビューに既に存在する制約が表示され、必要なフレーム値が計算され、必要な値自体にフレームが設定され、手動で設定した値が上書きされます。
詳細については、Apple のCocoa Auto Layout Guideの「Adopting Auto Layout」セクションを参照してください。