UIView框架未在viewDidAppear中更新

时间:2016-07-20 10:41:14

标签: ios objective-c uiview

我将Storyboardautolayout一起使用。在我的ViewController中,我有一个基本结构:一个UIScrollView和一个包含不同标签的contentView(UIView)。然后我在viewDidAppear内的类的contentView方法中添加了不同的元素,然后为了重新计算它的帧大小,我这样做:

- (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的框架没有更新,所以最后的元素总是不可点击(因为它们&#39 ;重新放置在视图的框架之外)。

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

4 个答案:

答案 0 :(得分:3)

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

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

_contentView.layoutIfNeeded()

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

答案 1 :(得分:1)

请更新主要队列上的用户界面

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

答案 2 :(得分:1)

我认为您所有与框架相关的信息都应位于 <activity android:name=".SplashScreenActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" / > viewWillLayoutSubviews()内。您可以在viewDidLayoutSubviews()中添加内容,但对于任何帧管理,我都会使用上述方法。

在您的特定情况下使用前者viewDidLoad()。但是,您可以使用@Simon McLoughlin提到的与代码相关的约束来解决这些问题。 &#39; scrollView变为不可滚动&#39;意味着您还应该更新viewDidLayoutSubviews(),以便同时关注它。

答案 3 :(得分:0)

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