2

ビューでは、新しい UIButton を挿入しています。AutoLayout を使用しているため、ボタンを挿入するビューの制約を取得する必要があります。古い制約を削除して後で新しい制約を作成できるように、プログラムで NSLayoutConstraint を取得するにはどうすればよいですか。ありがとう。

編集:ここに画像の説明を入力

図を参照すると、B1 と B2 の間に B3 を挿入する必要があるため、B1 と B2 の間に既に設定されている固定スペース制約を削除する必要があり、B3 の下部を B2 の上部に接続し、B3 の上部を B1 の下部に接続する必要があります。

4

2 に答える 2

2

B1 と B2 の間に既に設定されている固定スペース制約を削除する必要があります

プログラムによる制約の検索

B1ビューの制約で を検索するか、NSLayoutConstraint作成時の への参照を保持できます。の制約を検索するのB1は、おそらく効率が悪くなります。すべての関係制約 (ビューから別のビューへ) は、​​囲んでいる の一部ですsuperview。へのハンドルがあると仮定すると、次のようにそのスーパービューにB1すべての制約を一覧表示できます。B1

// Searching all relationship constraints involving b1
for item in self.view.constraints() {
    if let constraint = item as? NSLayoutConstraint {
        if let button = constraint.firstItem as? UIButton {
            if button == b1 {
                println("firstItem found: \(constraint)")
            }
        }
        if let button = constraint.secondItem as? UIButton {
            if button == b1 {
                println("secondItem found: \(constraint)")
            }
        }
    }
}

制約を思い出す

はるかにクリーンなアプローチは、NSLayoutConstraint後で変更または削除する への参照を保持することです。ストーリーボードでこれを行うには、必要な制約を作成します。

ここに画像の説明を入力

次に、コントロールを押しながら参照をソース ファイルに直接ドラッグして、後で操作します。

ここに画像の説明を入力

于 2015-08-25T21:59:15.553 に答える
0

以下のように、ビューに適用されるデフォルトの制約をオフにすることができます。プログラムで最初にボタンを作成したときに、以下のコードを適用します。

B1.translatesAutoresizingMaskIntoConstraints = NO;
B2.translatesAutoresizingMaskIntoConstraints = NO;
B3.translatesAutoresizingMaskIntoConstraints = NO;

ビューにすべてのボタンを追加した後、AddSubView以下の例のように、必要に応じて Constrain を再度設定します。

// Center the middle one vertically
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:B2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];

コンテナビュー内の複数のビューを均等に配置するスタックオーバーフローで最高の答えを見つけたのに役立つことを願っています 。

于 2013-07-12T06:03:19.060 に答える