web-dev-qa-db-ja.com

コードでtopLayoutGuideおよびbottomLayoutGuideへの自動レイアウト制約を作成する

Appleの documentation ビューとレイアウトガイドの1つとの間の自動レイアウト制約の作成では、 [〜#〜] vfl [〜#〜] を使用した例を示しています。

これらの制約をプログラムで作成する方法はありますかwithoutVFL( NSLayoutConstraintの他のAPI または同様のものを使用)

(注:Interface Builderではなくコードでこれを行うことを具体的に求めています。また、ガイドセットの計算されたlengthを制約の静的定数として望んでいません。レイアウトガイドの長さを変更すると、拘束されたビューの位置が自動的に調整されます。)

64
smileyborg

UIButtonUIViewController.topLayoutGuideの下に20ポイント配置する場合は、次のようにNSLayoutConstraintを作成します。

[NSLayoutConstraint constraintWithItem:self.button
                             attribute:NSLayoutAttributeTop
                             relatedBy:NSLayoutRelationEqual
                                toItem:self.topLayoutGuide
                             attribute:NSLayoutAttributeBottom
                            multiplier:1.0
                              constant:20.0];

IOS 9では、次の方法でNSLayoutConstraintを作成することもできます。

[self.button.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor
                                      constant:20.0];
93
Jamie McDaniel

@JamieMcDanielの答えを補足するため、Swift + iOS9バージョンは次のようになります。

self.button.topAnchor
    .constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true

.active = true部分を忘れないでください。そうしないと、制約が自動的に有効になりません。

6
SuitedSloth

@Jamie McDanielに追加するだけで、すぐに明らかでない場合は、彼が作成することを提案した制約を追加する必要があります。

NSLayoutConstraint *buttonTopConstraint = [NSLayoutConstraint constraintWithItem:self.button
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.topLayoutGuide
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:20.0];
[self.view addConstraint:buttonTopConstraint];
3
Alex Y

これは Gist 私が作成したもので、すべてのサブビューをxibに追加されたタンクビュー(コンテナビュー)に埋め込み、タンクビューとスーパービューxibの制約を削除し、上位の制約を追加しますiOS6の外観を与えるtopLayoutGuideへ。あなたが達成したいことは面白いかもしれません。

//This should be added before the layout of the view
- (void) adaptToTopLayoutGuide {
    //Check if we can get the top layoutguide
    if (![self respondsToSelector:@selector(topLayoutGuide)]) {
        return;
    }
    //tankView is a contaner view
    NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun
    [self.view removeConstraints:array];
    NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}];
    [self.view addConstraints:constraintsVertical];
    NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}];
    [self.view addConstraints:constraintsHorizontal];

}
3
Andrea