Ios UIView框架未在ViewDidDisplay中更新
我正在使用自动布局的故事板。在我的ViewController中,我有一个基本结构:一个UIScrollView和一个包含不同标签的contentView UIView。然后我在contentView中的类的ViewDidAspect方法中添加了不同的元素,为了重新计算其帧大小,我执行以下操作: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
- (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中的限制,现在它工作正常,谢谢: