Superview不会根据子视图约束增加高度

时间:2015-07-28 13:22:29

标签: ios objective-c uiview autolayout constraints

我有一个scrollview和一个单独的UIView,我在其中放置了一系列textFields和带有约束的标签,这些约束完全占据了顶部和底部。我试图根据其子视图约束来调整UIView的高度,但事实并非如此。发生的事情是视图保持其高度并迫使其他文本字段崩溃或缩小,从而打破约束。

详细

  1. 每个子视图优先级值: 压缩= 750 拥抱= 250
  2. UIView优先级值: 压缩= 249 拥抱= 749设定为低于其余部分。
  3. 大多数文本字段都有宽高比约束。这会导致字段调整。
  4. 每个子视图之间具有垂直/顶部/底部间距。顶部和底部元素也具有视图的顶部和底部约束。
  5. 我的代码是什么:

    -(void)viewDidLayoutSubviews{
        [super viewDidLayoutSubviews];
        /* I had to adjust the UIView's width to fill the entire self.view.*/
        if(![contentView isDescendantOfView:detailsScrollView]){
            CGRect r = contentView.frame;
            r.size.width = self.view.frame.size.width;
            contentView.frame = r;
            [detailsScrollView addSubview:contentView];
        }
    }
    

    截图

    视图

    enter image description here

    这是目前发生的事情。在这种情况下,它会强制电子邮件字段缩小。如果我在其上放置一个高度值,它不会缩小,但布局引擎会找到另一个要破坏的元素 enter image description here

    编辑:

    解决

    也许我只是需要一些休息来梳洗一下。我之前尝试过使用约束但没有运气。然而,由于这个建议,我回去设置约束,而不是在这个上设置框架,并让它最终工作。

    解决方案:

    -(void)viewDidLoad{
        [detailsScrollView addSubview:contentView];
    
        [contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [detailsScrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
        NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView,detailsScrollView);
        NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView]-0-|"
                                                                             options:NSLayoutFormatDirectionLeadingToTrailing                                                                             metrics:nil
                                                                               views:viewsDictionary];
        NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[contentView]-0-|"
                                                                           options:NSLayoutFormatDirectionLeadingToTrailing
                                                                           metrics:nil
                                                                             views:viewsDictionary];
        NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView(==detailsScrollView)]-0-|" options:0 metrics:nil views:viewsDictionary];
    
    }
    

1 个答案:

答案 0 :(得分:1)

使用界面构建器处理UIScrollView及其子UIView时。通常在UIScrollView及其子项之间设置top,bottom,left和equal width约束,在您的情况下为contentView

没有这些约束,另一个选项是设置UIScrollView的内容大小。这是在引入约束之前使用UIScrollView的方式。

  

所以,1。你应该以编程方式添加这些约束。

通过使用约束,不再需要视图框来调整视图大小。

  

所以,2。删除内容视图的框架设置。

我对你在viewDidLayoutMethod中设置框架的方式不太满意。如果我要在这里做,我会从if statement

中取出框架设置

代码如下:no if statement:

[detailsScrollView addSubview:contentView];

// then set the constraints here after adding the subview.

将此代码放在viewDidLayoutSubviews方法的任何位置,但不在其中。如果在语句中设置框架,那将是一个更大的问题。

  

注意:最初,如果要在viewDidLayoutSubviews中设置框架   方法。你应该为所有情况做这件事。例如,对于if情况   和其他情况。因为,下次这个方法将会是   调用视图将响应约束。失去了它的框架。

另一个观察结果:如果您希望视图响应其子视图约束,为什么需要为其设置框架?正确?

添加约束后,您可能需要调用方法constraintNeedsUpdate或其他相关方法。