11

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

拘束ピン

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

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

ここで、スーパービューのマージンに固定された先頭と末尾の両方のスペースを持つ別のビューをコードに追加したいので、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:または、可能でない場合、 APIで固定する方法は?

4

2 に答える 2

15

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];

Direct 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];
于 2014-10-10T17:43:34.160 に答える