2016-09-19 165 views
1

我在編程上創建約束,使視圖控制器視圖具有背景視圖和工具欄,底部的工具欄。我希望背景視圖的高度隨着工具欄高度的增加而減小。在將背景視圖和工具欄添加爲視圖控制器視圖的子視圖後,我調用(在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]; 
} 

另外,如果我查詢的工具欄和其制約因素的背景來看,對方說我已成立了最初不上來的限制?他們確實只顯示視圖控制器的視圖...這對我來說聽起來並不正確......?

非常感謝......

回答

1

如果您在設置了限制你的佈局也沒有意義設置邊界或框架爲您的意見,以更新的佈局。相反,在你可以通過改變約束

。例如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]]; 

欲瞭解更多信息,看看this答案。

+0

謝謝@Ishan Handa ...這非常有意義......我可以使用您的建議修復它...很多再次感謝... – vikram17000