首页 文章

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

提问于
浏览
29

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

我的视图层次结构是:
UIScrollView中

  • UIView(容器视图)
    ----- UILabel(多标签)
    -----一个UIWebView
    -----的UILabel
    -----的UIButton

View hierarchy in IB

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

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

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

我得到的结果如下:
enter image description here

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

任何帮助将不胜感激 .

您可以下载示例Xcode项目from here.

2 回答

  • 71

    您将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;
    }
    
  • 1

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

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

相关问题