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で固定する方法?
ありがとう!
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];
「iOS8では、ビジュアルフォーマット言語が更新され、「|-」または「 」がデフォルトでスーパービューのlayoutMarginsプロパティで定義された間隔を使用するようになりました。」
したがって、Interface Builderを使用してレイアウトを支援する場合は、「マージンに制約」オプションにチェックマークを付ける必要があります。もしそうなら、それは動作します。
それでも問題が解決しない場合は、デモプロジェクトをお願いします。
追加:T ---(彼の記事 新しいios8 APIの関数preservesSuperviewLayoutMarginsを示していますが、もっと役立つことを願っています。