我将Storyboard
与autolayout
一起使用。在我的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;
}
其中operators
是contentView
的最后放置元素,它始终位于框架的底部。我在viewDidAppear
中调用这两个方法,它们使视图可滚动,问题是contentView
的框架没有更新,所以最后的元素总是不可点击(因为它们&#39 ;重新放置在视图的框架之外)。
我做错了什么?为什么scrollView
变得可滚动但contentView
保留了它的旧框架?
答案 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)
尝试在滚动视图和最后放置的元素之间添加垂直空间约束。