2016-07-20 49 views
0

我正在使用Storyboardautolayout。在我的ViewController中,我有一个基本结构:一个UIScrollView和一个包含不同标签的contentView(UIView)。然后,我有我的类的viewDidAppear方法添加我的contentView里面,然后以重新计算不同元素的帧尺寸我这样做:UIView帧未在视图中更新DIDAppear

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

其中operatorscontentView最后放置的元素,它总是在框架的底部。我将这两种方法称为viewDidAppear,它们使视图可滚动,问题在于contentView的框架没有更新,因此最后一个元素始终是不可点击的(因为它们放置在视图框架之外)。

我在做什么错?为什么scrollView变得可滚动,但contentView保持它的旧框架?

+0

你使用自动布局吗? – Miknash

+0

@NickCatib是的我正在使用自动布局 – Signo

回答

3

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

您将需要(也应该)在你的代码添加新/修改的约束,当你添加新的元素。然后打电话

_contentView.layoutIfNeeded() 

经过所有的更新,让UI更新,如果它需要,它应该。

+0

我试过在我的contentView中使用高度约束,我像上面的代码中那样更新它: '_contentViewHeight.constant = operators.frame.origin.y + operators .frame.size.height;' 我的assing值是正确的,但高度根本不变。如果我调用'[_contentView layoutIfNeeded]''scrollView'变得不可滚动 – Signo

+1

@Signo 1.您不能设置框架高度和高度限制。这些是相互矛盾的。 2.您应该尝试让自动布局为您完成所有这些工作,而不是手动计算高度,请使用自动布局为您计算,对所有项目使用顶部/底部约束。 3.当您使用'layoutIfNeeded'时,_contentView是否正确展开? 4.从内容视图到滚动视图顶部以及从底部到底部是否存在限制? 5.您是否尝试在两个视图上调用'layoutIfNeeded'? –

+1

我懂了!在阅读第4点后,我再次检查了我在IB中的约束条件,并且有两个相互冲突的约束条件。我从清理'contentView'的限制,现在它的正常工作,根据所提供的信息谢谢:) – Signo

1

请更新UI在主队列

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

,这是没有什么帮助,OP已经声明了滚动正在更新,所以这显然是好的。 OP也没有提到任何后台任务。 –

1

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

在您的具体情况使用前,viewDidLayoutSubviews()。但是,您可以使用@Simon McLoughlin提到的与代码连接的约束来解决这类问题。 'scrollView变得不可滚动'意味着你也应该更新contentSize,所以请注意这一点。

0

尝试添加滚动视图和你的最后放置元素之间的垂直空间的限制。