UIStackView:从xib加载视图和更新subView的高度约束没有反映任何变化?

Vis*_*l16 6 objective-c uiscrollview ios uistackview

我的应用程序中有以下层次结构

- UIScrollView
- UIStackView
 - UIView 1  // load with xib and added in arrangedSubviews
   - UIScrollView 1.1 // horizontal scrolling, fixed height constraint 38
   - UIView 1.2 // called it childView. has fixed height 0 (I load the view from xib and add it here dynamically and update its height)
     - UIView 1.2.1 // called it New View
 - UIView 2
 - UIView 3
Run Code Online (Sandbox Code Playgroud)

所以我的问题是当我从xib加载一个视图并将其添加到UIView1.2也增加了高度约束0到新添加的子视图的高度但是什么都不会发生.UIView1.2高度没有预期更新.

self.constraintChildViewHeight.constant = 95;
[self layoutIfNeeded];

NewView *newView = (NewView *)[[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([FieldPhotoView class]) owner:self options:nil]objectAtIndex:0];
[newView setTranslatesAutoresizingMaskIntoConstraints:false];
[self.childView addSubview:newView];
[self applyConstraintsToParent:self.childView andSubView:newView];
Run Code Online (Sandbox Code Playgroud)

方法

- (void)applyConstraintsToParent:(UIView *)parentView andSubView:(UIView *)subView {
//constraints

NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0];

[parentView addConstraint:leading];

NSLayoutConstraint *trailing = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0];


[parentView addConstraint:trailing];

NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];

[parentView addConstraint:top];

NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-8];

[parentView addConstraint:bottom];

NSLayoutConstraint *equalWidth = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0];


[parentView addConstraint:equalWidth];

leading.active = true;
trailing.active = true;
top.active = true;
bottom.active = true;
equalWidth.active = true;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

#Edit1 - 子视图约束

ChildView(UIView 1.2)

#Edit2 - 为了更好地理解,我希望使用xib以编程方式实现此功能(In UIStoryBoard正常工作.)

在UIStoryBoard上工作实现

Abh*_*sha -1

根据您的问题,我了解到您无法在滚动视图 1.1 中滚动内容。

尝试以下步骤:

  1. 对于滚动视图1.1

    • 给出 View1 的顶部、底部、前导、尾随约束。
    • 给滚动视图高度约束= 38
  2. 对于子视图 UIView 1.2

    • 给出关于scrollview1.1的顶部、底部、前导、尾随约束
    • 将子视图固定到 View1 的前缘和后缘
    • 给予子视图高度限制
    • 给childview垂直居中约束。
  3. 对于新视图 UIView 1.2.1

    • 从笔尖加载视图。
    • 将其添加到子视图中
    • 设置其约束 - 顶部、底部、前导和尾随子视图。

这将使您的内容可滚动。

我在这里分享了一个示例项目:https ://github.com/Abhie87/StackExchangeSample

希望这会有所帮助。