75

iOS 7 では、ビューとトップ レイアウト ガイドの間に制約を追加できるようになりました。これは、iOS7 のステータス バー オフセットの問題を解決するのに非常に役立つと思います (特にビューにナビゲーション バーがない場合)。

ストーリーボード ファイルでは、この種の制約を簡単に追加できます。コントロール キーを押したままビューをコンテナーにドラッグすると、[トップ スペースからトップ レイアウト ガイド] オプションが表示されます。

ここに画像の説明を入力

しかし、xib ファイルで同じ操作を行うと、このオプションは表示されなくなります。

ここに画像の説明を入力

では、この種の制約を xib ファイルに追加する方法はありますか? または、コードで追加する必要がありますか?

4

7 に答える 7

77

次の例を参照してください。これは間違いなく問題の解決に役立ちます。これはhttp://developer.apple.comから入手しました。

[button setTranslatesAutoresizingMaskIntoConstraints: NO];
id topGuide = myViewController.topLayoutGuide;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (button, topGuide);

[myViewController.view addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat: @"V:[topGuide]-20-[button]"
    options: 0
    metrics: nil
    views: viewsDictionary]
];
于 2013-10-12T18:01:39.727 に答える
6

もちろん、プログラムでビューとtop layout guideまたはの間に制約を追加できるだけでなく、 KVConstraintExtensionsMasterライブラリを使用してbottom layout guide、ビューと の間の制約を削除してアクセスすることもできます。top and bottom layout guide

// create containerView
UIView *containerView = [UIView prepareNewViewForAutoLayout];
[containerView setBackgroundColor:[UIColor brownColor]];
[self.view addSubview:containerView];

// To add Top and Bottom Layout Guide constraint of containerView
[self applyTopLayoutGuideConstraintToView:containerView withPadding:0];
[self applyBottomLayoutGuideConstraintToView:containerView withPadding:50];

// To access top Layout Guide Constraint and update it's constant value.
NSLayoutConstraint *topLayoutGuideConstraint = [self accessAppliedTopLayoutGuideConstraintFromView:containerView];
topLayoutGuideConstraint.constant = 50;

// To access bottom Layout Guide Constraint and update it's constant value with animation
NSLayoutConstraint *bottomLayoutGuideConstraint = [self accessAppliedBottomLayoutGuideConstraintFromView:containerView];
bottomLayoutGuideConstraint.constant = 80;
[self.view updateModifyConstraintsWithAnimation:NULL]; // call this for animation

// To remove Top and Bottom Layout Guide constraint of containerView
[self removeAppliedTopLayoutGuideConstraintFromView:containerView];
[self removeAppliedBottomLayoutGuideConstraintFromView:containerView ];
于 2016-03-10T20:36:51.703 に答える
6

今まで XCode 6 を使用していても、コントロールを .xib ファイルのトップ レイアウト ガイドに揃えることができませんでした。代わりに、別の方法を使用しています。

まず、インターフェイスビルダーで、コントロールをビューコントローラーのビューの上部境界線に合わせます。

次に、viewDidLoad メソッドで、いくつかの制約を置き換えて、メイン ビューではなくトップ レイアウト ガイドに合わせます。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *constraints = self.view.constraints;
    for (NSLayoutConstraint *constraint in constraints) {
        if ( (constraint.firstItem == self.view) && (constraint.firstAttribute == NSLayoutAttributeTop) ) {
            NSLayoutConstraint *newConstraint = [self constraint:constraint replaceFirstItemBy:self.topLayoutGuide attribute:NSLayoutAttributeBottom];
            [self.view removeConstraint:constraint];
            [self.view addConstraint:newConstraint];
        } else if ( (constraint.secondItem == self.view) && (constraint.secondAttribute == NSLayoutAttributeTop) ) {
            NSLayoutConstraint *newConstraint = [self constraint:constraint replaceSecondItemBy:self.topLayoutGuide attribute:NSLayoutAttributeBottom];
            [self.view removeConstraint:constraint];
            [self.view addConstraint:newConstraint];
        }
    }
}

- (NSLayoutConstraint*)constraint:(NSLayoutConstraint*)constraint replaceFirstItemBy:(id)newItem attribute:(NSLayoutAttribute)newAttribute {
    UILayoutPriority priority = constraint.priority;
    NSLayoutRelation relation = constraint.relation;
    id secondItem = constraint.secondItem;
    NSLayoutAttribute secondAttribute = constraint.secondAttribute;
    CGFloat multiplier = constraint.multiplier;
    CGFloat constant = constraint.constant;

    NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:newItem attribute:newAttribute relatedBy:relation toItem:secondItem attribute:secondAttribute multiplier:multiplier constant:constant];
    newConstraint.priority = priority;
    return newConstraint;
}

- (NSLayoutConstraint*)constraint:(NSLayoutConstraint*)constraint replaceSecondItemBy:(id)newItem attribute:(NSLayoutAttribute)newAttribute {
    UILayoutPriority priority = constraint.priority;
    id firstItem = constraint.firstItem;
    NSLayoutAttribute firstAttribute = constraint.firstAttribute;
    NSLayoutRelation relation = constraint.relation;
    CGFloat multiplier = constraint.multiplier;
    CGFloat constant = constraint.constant;

    NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:firstItem attribute:firstAttribute relatedBy:relation toItem:newItem attribute:newAttribute multiplier:multiplier constant:constant];
    newConstraint.priority = priority;
    return newConstraint;
}

インターフェイスビルダーで定義したオブジェクトを置き換えるため、これは最善の方法ではないと考えてください。しかし、それは私たちが考えることができる別の方法かもしれません.

于 2014-10-16T06:50:58.903 に答える