UIStackView:从xib加载视图并更新subView的高度限制没有反映任何变化吗?

时间:2018-08-07 06:23:57

标签: ios objective-c uiscrollview 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

所以我的问题是,当我从xib加载视图并将其添加到UIView1.2时,也将高度限制0增加到了新添加的子视图的高度,但是什么也不会发生。UIView1.2 height确实做到了预计不会更新。

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];

方法

- (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;
}

enter image description here

#Edit1-子视图约束

ChildView(UIView 1.2)

#Edit2 -为了更好地理解,我想使用xib(在UIStoryBoard中可以正常工作)以编程方式实现此功能。

Working implementation on UIStoryBoard

2 个答案:

答案 0 :(得分:-1)

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

尝试以下步骤:

  1. 对于滚动视图1.1

    • 使用View1给出顶部,底部,前导,尾随约束。
    • 赋予scrollview高度限制= 38
  2. 对于子视图UIView 1.2

    • 使用scrollview1.1给出顶部,底部,前导,尾随约束
    • 使用View1固定子视图,以获取前沿和后沿
    • 赋予子视图高度限制
    • 赋予子视图垂直居中约束。
  3. 对于newView UIView 1.2.1

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

这将使您的内容可滚动。

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

希望这会有所帮助。

答案 1 :(得分:-2)

试图做同样的事情,它按预期工作。 我做了什么:

  • 初始视图层次结构如下所示: enter image description here
  • 堆栈视图约束在下一张图像上: enter image description here
  • 堆栈视图中的每个视图仅具有受约束设置的高度(我用于最后一个视图中的按钮,用于在索引为0的堆栈视图中添加/删除新视图)
  • 要添加的视图是从名为.xib的{​​{1}}文件加载的,视图的层次结构和下一个图像上的约束(名为SomeView.xib的约束设置为1并更改为95将View Height Constraint添加到堆栈视图时): enter image description here

点击按钮时调用的函数如下:

SomeView

希望这会给您有关如何解决您情况的任何建议