簡體   English   中英

自動布局約束沒有得到尊重

[英]Auto-layout constraints not getting respected

我以編程方式創建約束,以便視圖控制器視圖具有背景視圖和工具欄,工具欄位於底部。 我希望背景視圖的高度隨着工具欄高度的增加而降低。 在將背景視圖和工具欄作為子視圖添加到視圖控制器的視圖后,我調用(在 viewDidLoad 中)以下以編程方式設置約束的方法。

- (void)configureConstraintsForBackgroundViewAndToolbar {

    [self.backgroundView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.toolbarComponent setTranslatesAutoresizingMaskIntoConstraints:NO];

    UIView *constraintsBackgroundView = self.backgroundView;
    UIView *constraintsToolbar = self.toolbarComponent;

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(
                                    constraintsBackgroundView, 
                                    constraintsToolbar);
    NSDictionary *metricsDictionary = @{
                                        @"toolbarHeight":[NSNumber numberWithFloat:TOOLBAR_HEIGHT]
                                        };

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsBackgroundView]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsToolbar]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar(>=toolbarHeight)]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];
}

在我嘗試使用以下方法(通過嵌入的文本視圖)更新工具欄的高度之前,這一切正常。 我在這里做錯了什么嗎? 工具欄高度增加但背景視圖的高度沒有縮短(我使用 SparkInspector 進行調試)。 似乎很簡單,在這里遺漏了一些明顯的東西......

- (void)textViewDidChange:(UITextView *)textView {

    if (textView != self.toolbarTextView) {
        return;
    }

    CGFloat currentHeight = self.bounds.size.height;

    CGSize size = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, textView.frame.size.height)];
    CGFloat determinedHeight = fminf(fmaxf(size.height, TOOLBAR_HEIGHT), MAX_TOOLBAR_HEIGHT);

    [self setBounds:CGRectMake(0, 0, self.bounds.size.width, determinedHeight)];    

    [self setNeedsLayout];
}

另外,如果我查詢工具欄和背景視圖的約束,我最初設置的彼此之間的約束沒有出現? 它們確實只顯示視圖控制器的視圖……這對我來說也不合適……?

非常感謝...

如果您使用約束設置布局,則為視圖設置邊界或框架以更新布局是沒有意義的。 而是以一種可以通過更改約束的constant屬性來編輯布局的方式添加約束

例如:

使用特定約束設置工具欄的高度並將其存儲在屬性中

NSLayoutConstraint *toolBarHeightConstraint = [NSLayoutConstraint constraintWithItem:constraintsToolbar
                                                                           attribute:NSLayoutAttributeHeight
                                                                           relatedBy:NSLayoutRelationEqual
                                                                              toItem:self.view
                                                                           attribute:NSLayoutAttributeNotAnAttribute
                                                                          multiplier:1
                                                                            constant:TOOLBAR_HEIGHT];

然后通過更改約束的常量來更改工具欄的高度。 喜歡:

toolBarHeightConstraint.constant = newHeight;

在您的情況下,您還需要將垂直約束更改為:

[NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

有關更多信息,請查看答案。

暫無
暫無

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

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