32

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

我的视图层次结构是:
UIScrollView
-- UIView (Container view)
-----UILabel (Multirow label)
-----UIWebView
-----UILabel
-----UIButton

在 IB 中查看层次结构

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

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
} 

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

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

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

任何帮助将不胜感激。

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

4

2 回答 2

73

您将 webView 的高度约束设置为 266。这就是为什么 web 视图的高度仍然固定的原因。

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

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint;

然后您可以在 Web 视图完成下载内容时修改高度约束的常量。Web 视图本身由内部的滚动视图组成,因此如果要获取内容的整体高度:

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

或者显然这个也有效:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
    self.webViewHeightConstraint.constant = self.webView.frame.size.height;
}
于 2013-07-07T07:47:43.533 回答
1

在更新 webview 内容大小之前,您可能需要延迟。砌体对于自动布局使用很有用。

-(void)webViewDidFinishLoad:(UIWebView *)webview{
    [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.001];
}

-(void)checkContentOnDelay:(UIWebView *)webview{
    CGSize contentSize = webview.scrollView.contentSize;
    if (contentSize.height > 2) {
        [webview updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(contentSize.height);
        }];
    }else{
        [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.01];
    }
}
于 2015-05-19T10:55:19.167 回答