[解決済み] UIViewに影響するすべての制約を取り除く
質問
いくつかの制約を介して画面上に配置されるUIViewがあります。制約のいくつかはスーパービューによって所有され、その他は他の祖先によって所有されます(たとえば、UIViewControllerのviewプロパティなど)。
これらの古い制約をすべて削除し、新しい制約を使用して新しい場所に配置したいと思います。
1つ1つの制約に対してIBOutletを作成し、どのビューがその制約を所有しているかを覚えることなく、これを行うにはどうしたらよいですか?
詳しく説明すると、素朴なアプローチは、各制約のために多くのIBOutletを作成することであり、その後、次のようなコードを呼び出すことを含むでしょう。
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
このコードの問題は、最も単純なケースでも2つのIBOutletsを作成する必要があることです。複雑なレイアウトの場合、必要なIBOutletは簡単に4つまたは8つに達する可能性があります。さらに、制約を取り除くための呼び出しが、適切なビューで呼び出されていることを確認する必要があります。例えば、次のように想像してください。
myViewsLeftConstraint
が所有する
viewA
. もし私が誤って
[self.view removeConstraint:self.myViewsLeftConstraint]
を誤って呼んでしまっても、何も起こりません。
注意してください。 メソッド constraintsAffectingLayoutForAxis は有望に見えますが、デバッグのためだけのものです。
更新しました。
私が受け取っている多くの回答は
self.constraints
,
self.superview.constraints
またはそれらのいくつかのバリエーションです。これらのメソッドは制約だけを返すので、これらの解決策はうまくいきません。
所有
ではなく、ビューによって
に影響する
に影響を与えるものではありません。
これらの解決策の問題点を明らかにするために、このビュー階層を考えてみましょう。
-
グランドファーザー
-
父
-
私
- 息子
- 娘
- 兄弟
-
私
- おじさん
-
父
今、以下の制約を作成し、常に最も近い共通の祖先に添付することを想像してみてください。
- C0: Me: Son と同じトップ (Me が所有)
- C1: 私: 幅 = 100 (私の所有物)
- C2: 私:兄と同じ高さ(父所有)
- C3:私:叔父と同じ上半身(祖父所有)
- C4:私:お爺さんと同じ左(お爺さん所有)
- C5:弟:父と同じ左(父が所有)
- C6:叔父:祖父と同じ左(祖父が所有)
- C7: 息子:娘と同じ左側(私が所有)
次に、次のような制約をすべて取り除くとします。
Me
. 適切な解決策であれば
[C0,C1,C2,C3,C4]
を削除し、それ以外は何もしないことです。
もし私が
self.constraints
(selfはMe)とすると、以下のようになります。
[C0,C1,C7]
を取得します。これらはMeによって所有される唯一の制約であるためです。明らかに、これが欠けているので、これを削除するだけでは十分ではないでしょう。
[C2,C3,C4]
. さらに、それは
C7
を不必要に削除しています。
もし私が
self.superview.constraints
(selfはMe)とすると、以下のようになります。
[C2,C5]
を得ます。これらは父が所有する制約だからです。明らかに、私たちはこれらすべてを取り除くことはできません。
C5
とは全く関係なく
Me
.
もし私が
grandfather.constraints
とすると
[C3,C4,C6]
. ここでも、これらすべてを削除することはできません。
C6
はそのまま残っていなければならないので、これらすべてを削除することはできません。
ブルートフォースアプローチは、ビューの祖先(自分自身を含む)のそれぞれをループして、もし
firstItem
または
secondItem
がビュー自身である場合、その制約を取り除きます。これは正しい解決策を導き、
[C0,C1,C2,C3,C4]
を、そしてそれらの制約だけを返す、正しい解決につながります。
しかし、先祖のリスト全体をループするよりも、よりエレガントなソリューションがあることを期待しています。
どのように解決するのですか?
私が今までに見つけた唯一の解決策は、そのスーパービューからビューを削除することです。
[view removeFromSuperview]
これは、レイアウトに影響を与えるすべての制約を削除し、スーパービューに追加し、新しい制約を追加する準備ができているように見えます。しかし、階層からすべてのサブビューを誤って削除し、また
[C7]
のように、正しく表示されます。
関連
-
[iOS]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
制御が非ボイド関数の終了に達する
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] UIViewに角丸をつける
-
[解決済み] UIDevice uniqueIdentifierは非推奨 - どうしたらいいの?
-
[解決済み] ビューを非表示にしたときに、オートレイアウトで他のビューを移動するには?
-
[解決済み】Xcode 6でAutoLayout制約を使用してアスペクトフィットの動作をエミュレートする
-
[解決済み] オートレイアウトの場合、CALayerのアンカーポイントを調整するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] ぼかしの入ったオーバーレイビューの作成