web-dev-qa-db-ja.com

iOS8自動レイアウトはプログラムで相対レイアウトマージンに固定します

Interface Builderのスーパービューに固定された先頭と末尾の両方のスペースを持つUI要素(実際にはUISwitchですが、実際には重要ではありません)があります。 Xcode 6では、制約は次のようになります。

Constraint pin

先頭のスペースの制約は事実上同じです。制約の値は42.0ポイント

さまざまなデバイスでlayoutMarginsUIViewプロパティを変更でき、制約が正しく機能してビュー間のマージンが増えるため、これはまさに私が望んでいることです。

ここで、コードに別のビューを追加します。このビューには、先頭と末尾の両方のスペースがスーパービューマージンに固定されているため、同じlayoutMarginsをスーパービューに設定しても機能します。

次の構文でビジュアル形式言語を使用してビューを固定しました。

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)];

[self.contentView addConstraints:constraints];
[self.contentView setNeedsUpdateConstraints];

これは機能しますが、layoutMarginsプロパティはこの制約を使用しても効果がないため、明らかにマージンに固定されておらず、直接スーパービューに固定されています。

だから私の質問は:

ビジュアルフォーマット言語を使用してコードのマージンにUI要素スペースを固定する方法?または不可能な場合はconstraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: AP​​Iで固定する方法?

ありがとう!

10
Legoless

IOS8では、ビジュアルフォーマット言語が更新され、「|-」または「-|」になりました。デフォルトでは、スーパービューのlayoutMarginsプロパティで定義された間隔が使用されます。

したがって、ビジュアルフォーマット言語を使用した答えは次のとおりです。

// programmatically set the layoutMargins, only if
// you want non-default values and they are not already set in IB!
self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42

// assume: seperatorView is already a subview of self.contentView

// separatorView will use the constraints because we write "-" between it and the superview Edge
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)];
[self.contentView addConstraints:constraints];

ダイレクトAPIを介して制約を作成するときにレイアウトマージンを参照する場合は、新しいiOS8のみのレイアウト属性を使用します。

NSMutableArray * constraints = [NSMutableArray array]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
     attribute:NSLayoutAttributeLeftMargin 
     relatedBy:NSLayoutRelationEqual 
     toItem:separatorView
     attribute:NSLayoutAttributeLeft
     multiplier:1.0
     constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
     attribute:NSLayoutAttributeRightMargin 
     relatedBy:NSLayoutRelationEqual 
     toItem:separatorView
     attribute:NSLayoutAttributeRight
     multiplier:1.0
     constant:0]];
[self.contentView addConstraints:constraints];
14
algal
4
Jenus Dong