iOS 6中具有自动布局的动态UIView高度

Ger*_*hat 30 objective-c autolayout ios6

在过去的几天里,我试图使用自动布局约束完成一个相当简单(至少应该是)布局,但没有成功.

我的视图层次结构是:
UIScrollView
- UIView(容器视图)
----- UILabel(Multirow标签)
----- UIWebView
----- UILabel
----- UIButton

查看IB中的层次结构

所需的功能是根据内容的大小进行扩展的Container视图.为了增加UIWebView的高度,我使用以下代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
} 
Run Code Online (Sandbox Code Playgroud)

我尝试了许多不同的约束,最合理的约束是:
1.从第一个标签(事件标题)的superview引脚顶部空间
2.第一个标签和UIWebView的
引脚垂直间距3.其余元素的引脚垂直间距(即UIWebView - UILabel(事件日期)和UILabel(事件日期) - UIButton)
4.容器视图具有低优先级(1)底部垂直空间约束及其超级视图

我得到的结果如下: 在此输入图像描述

UIWebView扩展但不会按下事件日期标签和按钮,而且Container视图也不会展开.

任何帮助将不胜感激.

您可以从这里下载示例Xcode项目.

Val*_*hie 71

您将webView的高度约束设置为266.这就是为什么Web视图的高度仍然是固定的.

您可以将此高度约束创建为IBOutlet,例如:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在Web视图下载完内容后修改高度约束的常量.Web视图本身包含内部滚动视图,因此如果您想获得内容的整体高度:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height;
}
Run Code Online (Sandbox Code Playgroud)

或者显然这个也有效:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
    self.webViewHeightConstraint.constant = self.webView.frame.size.height;
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议你不要使用sizeToFit.相反,使用intrinsicContentSize.如果您使用的对象没有返回正确的内部内容大小(例如UITextView中的情况),请创建一个简单的子类并覆盖该方法以返回适当的内容,即sizeThatFits或contentSize.当这个改变时,不要忘记调用invalidateIntrinsicContentSize! (2认同)