2016-09-19 168 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