Ios UIView框架未在ViewDidDisplay中更新

Ios UIView框架未在ViewDidDisplay中更新,ios,objective-c,uiview,Ios,Objective C,Uiview,我正在使用自动布局的故事板。在我的ViewController中,我有一个基本结构:一个UIScrollView和一个包含不同标签的contentView UIView。然后我在contentView中的类的ViewDidAspect方法中添加了不同的元素,为了重新计算其帧大小,我执行以下操作: - (void)fixContentViewHeight { _contentView.frame = CGRectMake(_contentView.frame.origin.x, _con

我正在使用自动布局的故事板。在我的ViewController中,我有一个基本结构:一个UIScrollView和一个包含不同标签的contentView UIView。然后我在contentView中的类的ViewDidAspect方法中添加了不同的元素,为了重新计算其帧大小,我执行以下操作:

- (void)fixContentViewHeight 
{
    _contentView.frame = CGRectMake(_contentView.frame.origin.x, _contentView.frame.origin.y, _contentView.frame.size.width, operators.frame.origin.y + operators.frame.size.height);
     //constraint for contentView height
    _contentViewHeight.constant = operators.frame.origin.y + operators.frame.size.height;
}

- (void)fixScrollViewHeight 
{
    _scrollView.frame = _contentView.frame;
    _scrollView.contentSize = _contentView.frame.size;
}
如果操作符是contentView的最后一个放置元素,则它始终位于框架的底部。我在ViewDidDisplay中调用这两个方法,它们使视图可滚动,问题是contentView的框架没有得到更新,所以最后的元素总是不可滚动的,因为它们位于视图框架之外


我做错了什么?为什么scrollView可以滚动,但contentView保留了它的旧框架?

如果您有影响contentView高度的自动布局约束,您将无法通过设置框架来更改其高度,因为约束将覆盖它

在添加新元素时,您需要并且应该在代码中添加新的/修改约束。然后打电话

_contentView.layoutIfNeeded()

在所有更新之后,如果需要,UI应该更新。

如果您的自动布局约束影响了“内容视图”的高度,您将无法通过设置框架来更改其高度,因为约束将覆盖该高度

在添加新元素时,您需要并且应该在代码中添加新的/修改约束。然后打电话

_contentView.layoutIfNeeded()

在所有更新之后,如果需要,让UI更新,它应该更新。

请更新主队列上的UI

dispatch_async(dispatch_get_main_queue(), ^{
            // update any UI on Main queue
        });

请更新主队列上的UI

dispatch_async(dispatch_get_main_queue(), ^{
            // update any UI on Main queue
        });

我认为所有与框架相关的信息都应该在viewWillLayoutSubviews和viewDidLayoutSubviews中。您可以在viewDidLoad中添加内容,但对于任何帧管理,我都会使用上述方法


在您的特定情况下,请使用前面的ViewDidLayoutSubView。但是,您可以使用@Simon McLoughlin提到的与代码连接的约束来解决此类问题scrollView变得不可滚动”意味着您也应该更新contentSize,因此请注意这一点。

我认为所有与帧相关的信息都应该在ViewWillLayoutSubview和ViewDidLayoutSubview中。您可以在viewDidLoad中添加内容,但对于任何帧管理,我都会使用上述方法


在您的特定情况下,请使用前面的ViewDidLayoutSubView。但是,您可以使用@Simon McLoughlin提到的与代码连接的约束来解决此类问题scrollView变得不可滚动”意味着您也应该更新contentSize,因此请注意这一点。

尝试在滚动视图和最后放置的元素之间添加垂直空间约束。

尝试在滚动视图和最后放置的元素之间添加垂直空间约束。

是否使用自动布局?@NickCatib是的,我是使用autolayout您使用autolayout吗?@NickCatib是的,我使用autolayout基于提供的信息,这没有帮助,OP已经声明scrollview正在更新,因此这显然是好的。OP也没有提到任何后台任务。根据提供的信息,这不会有帮助,OP已经声明scrollview正在更新,所以这显然是好的。OP也没有提到任何背景任务。我尝试在contentView中使用高度约束,我像上面发布的代码一样更新它:_contentViewHeight.constant=operators.frame.origin.y+operators.frame.size.height;I assing的值是正确的,但高度没有任何变化。如果调用[\u contentView layoutifneed],滚动视图将变为unscrollable@Signo1.无法设置框架高度和高度约束。这些是相互矛盾的。2.您应该尝试让autolayout为您完成所有这些工作,而不是手动计算高度,让autolayout为您计算高度,对所有项目使用顶部/底部约束。3.使用layoutIfNeeded时,\u contentView是否正确展开?4.从内容视图到滚动视图顶部以及从底部到底部是否存在约束?5.你试过在两个视图上都调用layoutifneed吗?我成功了!阅读第4点后,我再次检查了IB中的约束,发现有两个约束冲突。我已经清除了contentView中的约束,现在它工作正常,谢谢:我尝试在contentView中使用高度约束,我像上面发布的代码一样更新它:_contentViewHeight.constant=operators.frame.origin.y+operators.frame.size.height;I assing的值是正确的,但高度没有任何变化。如果调用[\u contentView layoutifneed],滚动视图将变为unscrollable@Signo1.无法设置框架高度和高度约束。这些是相互矛盾的。2.您应该尝试让autolayout为您完成所有这些工作,而不是手动计算高度,让autolayout为您计算高度
,对所有项目使用顶部/底部约束。3.使用layoutIfNeeded时,\u contentView是否正确展开?4.从内容视图到滚动视图顶部以及从底部到底部是否存在约束?5.你试过在两个视图上都调用layoutifneed吗?我成功了!阅读第4点后,我再次检查了IB中的约束,发现有两个约束冲突。我已经清除了contentView中的限制,现在它工作正常,谢谢: