最近、自動レイアウトに取り組んでおり、私は本当に些細な問題の例のように見えるものに固執しています。私は、画面の上部に座って、画面の高さの半分を占有するビューを持っています。自動レイアウトの前にシンプル-所定の位置に固定して、スーパービューのサイズが変更されたときに垂直方向に拡張するように指示します。
今、私は私の人生のためにそれを行う方法を見ることができません。これを設定しようとすると次のようになります。
下部スペースの制約は「等しい284」に設定されます。これは、iPhone4レイアウトに変更すると絶対に使用できなくなります。画面の下部に284ポイントのスペースを保持し、ビューを半分に縮小します。画面のサイズ。そして、その制約を他のビューの高さの一部に等しく設定する方法はありません。
しばらく苦労した後、これを行う唯一の方法は、このビューの下に別のビューを導入し、それらの高さを等しく固定し、互いの上と下に座ってから、2番目(下)のビューを非表示に設定することです..これは少しいようです!
明らかな何かが欠けていますか?..
これは[少なくとも] Xcode 5.1.1の時点でIBで可能になりました。理解するのに時間がかかりましたが、実際には非常に簡単です:
最初に、基本的な上部の配置制約を作成します(通常のように、下部、左、および右の制約も設定する必要があります)。次に、制約を選択してAttributeインスペクターに移動します。
その後、乗数を調整できます。必要に応じて、スーパービューの50%を1
のままにします。これは、スーパービューの中心ごとに配置されるためです。これは、他の割合のビュー(スーパービューの25%など)を作成する優れた方法でもあります
ビュー間の正確な比率を設定できるストーリーボードソリューション:
現在:
PROFIT !!!
追伸また、このメソッドは異なるネストレベルのビューで機能し、(明らかに)幅に適用できることにも注意してください。
P.P.S.場合によっては、制約の「最初と2番目の項目を逆にする」か、逆乗数を設定すると便利な場合があります(たとえば、0.5ではなく2)。
もう少し時間が経つと、私は次のことを思いつきました。
私はそれを答えとして注目していますが、Interface Builderでは実際にこれを行うことはできないと仮定しているため、あまり満足ではありませんが、正しい制約は後でコードに追加できます:
- (void) viewWillAppear:(BOOL)animated
{
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:.5
constant:0];
[self.view addConstraint:constraint];
}
基本的に、self.viewの高さに対して0.5の乗数を設定し、upperviewに作用します。 IBの下部の垂直方向のスペース制約の優先度を1000未満に設定して、制約を破ることに関する多くのランタイムメッセージを回避する必要がありました。
だから誰かがInterface Builderでこれを行う方法を示すことができれば、それは私の質問に答える方が良いでしょう、そうでなければ、これは(今のところ)得るのと同じくらい良いと思いますか?
また、同じ高さのビューが2つある場合のコードの別の可能性もあります。view2の高さをview1の高さに設定するだけです(ここでのコツは、view1の高さを明示的に設定しないことです)。
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
options:0
metrics:nil
views:viewsDict]];
Meteの回答の迅速なバージョン:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
upperView.translatesAutoresizingMaskIntoConstraints = false
var constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.top,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.top,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.height,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.height,
multiplier: 0.5,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.leading,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.leading,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.trailing,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.trailing,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
}