【问题标题】:Dynamic UIView height with auto layout in iOS 6iOS 6 中具有自动布局的动态 UIView 高度
【发布时间】:2013-07-04 19:28:16
【问题描述】:

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

我的视图层次结构是:
UIScrollView
-- UIView(容器视图)
-----UILabel(多行标签)
-----UIWebView
-----UILabel
-----UI按钮

所需的功能是根据内容的大小扩展容器视图。为了增加 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 项目from here.

【问题讨论】:

    标签: objective-c ios6 autolayout


    【解决方案1】:

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

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

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

    然后你可以在网页视图下载完内容后修改高度约束的常量。 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;
    }
    

    【讨论】:

    • 我希望我能对此投票一百万次......你的回答刚刚结束了 4 个小时的敲击键盘。
    • 我有一个简单得多的问题,只是无法正常工作。它只是“主要”View 中的Content View 中的Content View 中的Label,我按照您所说的将约束设置为label.frame.size.height,但它不起作用。据我了解contentSize 应该自动“增长”。代码在这里:loessl.org/~hashier/relpub_2/DynLabel.zip
    • 我建议您不要使用 sizeToFit。相反,使用intrinsicContentSize。如果您使用的对象没有返回正确的内在内容大小,例如 UITextView 中的情况,请创建一个简单的子类并覆盖该方法以返回适当的内容,即 sizeThatFits 或 contentSize。当这种情况发生变化时,不要忘记调用 invalidateIntrinsicContentSize!
    • 那么旋转呢?在纵向中,我得到 1000pt 高度的内容。我在横向旋转,但 WebView 的高度由高度约束固定。似乎唯一的方法是重新计算高度并在 willLayoutSubviews 更改高度约束
    【解决方案2】:

    在更新 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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多