簡體   English   中英

UIView靈活的高度與NSLayoutConstraints

[英]UIView flexible height with NSLayoutConstraints

我在代碼中向我的UIViewController添加了一些視圖,並使用NSLayoutConstraints將它們定位在屏幕上我想要的位置。 在代碼中成為NSLayoutConstraints的新手; 我做了一個測試設置,並且在95%的路上。 這是我目前的代碼:

UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:redView];

    [redView addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                        attribute:NSLayoutAttributeHeight
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:nil attribute:0
                                                       multiplier:1
                                                         constant:100]];

    [redView addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                        attribute:NSLayoutAttributeWidth
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:nil
                                                        attribute:0
                                                       multiplier:1
                                                         constant:693]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                          attribute:NSLayoutAttributeTop
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeTop
                                                         multiplier:1
                                                           constant:60]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                          attribute:NSLayoutAttributeCenterX
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeCenterX
                                                         multiplier:1
                                                           constant:0]];


    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:blueView];
    [blueView addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                         attribute:NSLayoutAttributeHeight
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:nil
                                                         attribute:0
                                                        multiplier:10
                                                          constant:50]];

    [blueView addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:nil attribute:0
                                                        multiplier:1
                                                          constant:693]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:redView attribute:NSLayoutAttributeBottom
                                                         multiplier:1 constant:70]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                          attribute:NSLayoutAttributeCenterX
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:redView
                                                          attribute:NSLayoutAttributeCenterX
                                                         multiplier:1
                                                           constant:0]];


    UIView *orangeView = [[UIView alloc] init];
    orangeView.backgroundColor = [UIColor orangeColor];
    orangeView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:orangeView];
    [orangeView addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                           attribute:NSLayoutAttributeHeight
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:nil
                                                           attribute:0
                                                          multiplier:1
                                                            constant:25]];

    [orangeView addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                           attribute:NSLayoutAttributeWidth
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:nil
                                                           attribute:0
                                                          multiplier:1
                                                            constant:693]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:blueView
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1
                                                           constant:25]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                          attribute:NSLayoutAttributeCenterX
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:blueView
                                                          attribute:NSLayoutAttributeCenterX
                                                         multiplier:1
                                                           constant:0]];

看起來像這樣 - 我想要它:(忽略灰色背景 - 這就是superView) 看起來像這樣

現在我要做的是獲取orangeView的高度,將屏幕的其余部分填充到superView的底部。 但是,當我向orangeView添加底部約束時,它也會調整其他視圖高度。

如何獲得橙色視圖高度以填充其下方的灰色區域?

編輯:

刪除orangeView上的高度約束並向orangeView添加一個底部約束,如下所示:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1
                                                           constant:0]];

像這樣更改視圖:

在此輸入圖像描述

您在橙色視圖上設置固定高度,那么它如何展開並填充整個視圖?

另外我建議你將視圖頂部固定在上一個視圖的底部,因為你可以輕松地改變視圖大小並保持間距均勻,否則你將不得不調整自下而上的常量關系。

這是一個可以正常工作的代碼:

UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:redView];

[redView addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                    attribute:NSLayoutAttributeHeight
                                                    relatedBy:NSLayoutRelationEqual
                                                       toItem:nil
                                                    attribute:0
                                                   multiplier:1
                                                     constant:100]];

[redView addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                    attribute:NSLayoutAttributeWidth
                                                    relatedBy:NSLayoutRelationEqual
                                                       toItem:nil
                                                    attribute:0
                                                   multiplier:1
                                                     constant:693]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                      attribute:NSLayoutAttributeTop
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeTop
                                                     multiplier:1
                                                       constant:60]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1
                                                       constant:0]];


UIView *blueView = [[UIView alloc] init];
blueView.backgroundColor = [UIColor blueColor];
blueView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:blueView];
[blueView addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                     attribute:NSLayoutAttributeHeight
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:nil
                                                     attribute:0
                                                    multiplier:1
                                                      constant:50]];

[blueView addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                     attribute:NSLayoutAttributeWidth
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:nil attribute:0
                                                    multiplier:1
                                                      constant:693]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                      attribute:NSLayoutAttributeTop
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:redView attribute:NSLayoutAttributeBottom
                                                     multiplier:1 constant:10]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:blueView
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:redView
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1
                                                       constant:0]];


UIView *orangeView = [[UIView alloc] init];
orangeView.backgroundColor = [UIColor orangeColor];
orangeView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:orangeView];

[orangeView addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                       attribute:NSLayoutAttributeWidth
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:nil
                                                       attribute:0
                                                      multiplier:1
                                                        constant:693]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                      attribute:NSLayoutAttributeTop
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:blueView
                                                      attribute:NSLayoutAttributeBottom
                                                     multiplier:1
                                                       constant:25]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                      attribute:NSLayoutAttributeBottom
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeBottom
                                                     multiplier:1
                                                       constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:orangeView
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:blueView
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1
                                                       constant:0]];

您需要的是將Y constraints設置為橙色視圖:設置bottomLayout約束和藍色視圖的垂直間距。 如果XCode用橙色警告警告你,請閱讀這些警告,它通常會說“你需要X約束來查看”。

[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[yourViewHere(300)]-50-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(yourViewHere)]];

其中(300)是您視圖的寬度。 該代碼修剪器將bottomLayout中的約束設置為您的視圖。 如上所述添加類似的約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM