私は、parentViewの問題の一部であるdyanmicViewに対処し、そこから先に進みます
最初:ビューを動的に作成している場合は問題ありませんが、ストーリーボードから作成した場合は、親から切り離してから再接続する必要があります..それを取り除く方法です新しいものと競合する可能性のある以前の NSConstraints (通常はストーリーボードで導入されます)。
setTranslatesAutoresizingMaskIntoConstraints
また、nsconstraints に干渉する可能性がある NO b/c に設定する必要があります。
私は通常、 mapObjectsUsingBlockを使用して、最後の 2 つの手順を次のように行います。これにより、制約を作成するという面倒なプロセス全体が、より快適で自然になります。
[@[view_1, view_2, /../, view_n] mapObjectsApplyingBlock:^(UIView *view) {
[view removeFromSuperview];
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
[view setHidden:NO];
[superView addSubview:view];
}];
次に、nsconstraints を適用する前に、制約を適用するビューが既にその親にアタッチされていることを確認する必要があります。
[parentView addSubview:dynamicView];
次に、バインディング ディクショナリを作成します。
NSDictionary *buttonBindingsDictionary = @{ @"parentView" : parentView,
@"dynamicView" : dynamicView};
次に、ビジュアル フォーマット言語を使用して制約を追加します。ここでも使用mapObjectsUsingBlock
します (各制約について英語で説明します)。
NSArray *buttonConstraints = [@[@"V:|-[dynamicView(>=200)]-|",
@"|-[dynamicView(>=260)]-|",
] mapObjectsUsingBlock:^id(NSString *formatString, NSUInteger idx){
return [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:buttonBindingsDictionary];
}];
V:|-[dynamicView(>=200)]-|
dynamicView
垂直に言えば..とその親の間の上下の距離が等しくなければならないことを意味します.. また、dynamicView's
高さはそれ以上でなければなりません200
|-[dynamicView(>=260)]-|
dyanmicview
水平に言えば..とその親の間の左右の距離が等しくなければならないことを意味します..また、dyanmicView's
幅はそれ以上でなければなりません260
注:自分で計算して、dyanicView
親との間の左/右/下/上の距離を正確に設定できます..これは単純です..しかし、nsconstraints が台無しになることがあるので、自分でやらなければなりません。
その場合、x
思いついた距離は次のようになります。
V:|-x-[dynamicView(>=200)]-x-|
|-x-[dynamicView(>=260)]-x-|
次に、制約を親ビューに追加する必要があります。
[parentView addConstraints:[buttonConstraints flattenArray]];
ここで、 flatten arrayを使用したことに注意してください。これは、ライブラリ b/ci のメソッドであり、配列の配列ではなく、1 レベルの配列をフィードする必要があります。
そして、あなたは行く準備ができています!
注:これが完全に機能しない可能性があることはわかっています..しかし、何をすべきか+いくつかのヘルパーファイルのアイデアが得られます。ある程度の練習が必要です。確かにいくつかのチュートリアルを確認する必要があります..ストーリーボードを使用してnsconstraintsから始めることをお勧めします(ビューを選択できます..次にエディタ>ピン>..に移動し、何かを選択しました..すぐに入手してください視覚的なフィードバック.. また、View Controller を選択し、属性インスペクターに移動して、シミュレートされたメトリックの下で異なるサイズを選択することにより、ストーリーボードですぐにビューが 3.5 インチ ディスプレイと 4.0 インチ ディスプレイでどのように見えるかをシミュレートできます)。
時間はかかりますが、確かなことが 1 つあります。一度 nsconstraints を実行すると、後戻りすることはありません。それは完全に価値があります!
ps nsconstraints を使用してビューをアニメーション化することもできます..念のため。