2013-07-07 77 views
29

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

我的看法层次是:
的UIScrollView
- 的UIView(容器视图)
-----的UILabel(多排标签)
-----一个UIWebView
-----的UILabel
-----的UIButton

View hierarchy in IB

所需functionallity是容器v中根据内容的大小进行扩展。为了提高我使用下面的代码中的UIWebView的高度:

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

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

结果我得到的是以下几点: enter image description here

的UIWebView的扩展,但不下推事件日期标签和按钮,加上集装箱观点并不要么扩大。

任何帮助将不胜感激。

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

回答

71

您设置的网页视图的高度contraint为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

非常感谢您的回答。它像一个魅力一样工作! – Gerhat

+1

我希望我可以百万次提升这个数字...你的回答刚刚结束了我的键盘上敲了4个小时的头。 – shulmey

+0

我有一个更简单的问题,只是不能得到它的工作。它只是在“主视图”中的“滚动视图”中的“内容视图”中的一个“标签”,我按照你的说法来设置约束到“label.frame.size.height”,但它不是加工。据我所知'contentSize'应该“自动增长”。代码在这里:http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

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