使用自动布局以编程方式创建视图层次结构

Posted

技术标签:

【中文标题】使用自动布局以编程方式创建视图层次结构【英文标题】:Create view hierarchy programmatically with Auto Layout 【发布时间】:2014-10-28 14:45:00 【问题描述】:

我想该层次结构具有以下结构: 界面视图-> UIWebView 我想在 UIView 的底部为 UIToolbar 留出一些空间。

结果应该和这个 xib 文件一样:

到目前为止的代码:

- (void)loadView

    UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    
    self.view = view;

    self.webView = [[UIWebView alloc] init];
    self.webView.scalesPageToFit = YES;
    [self.view addSubview:self.webView];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;    
    self.webView.translatesAutoresizingMaskIntoConstraints = NO;

    NSDictionary *nameMap = @@"webView" : self.webView;

    NSArray *c1Array =
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[webView]-0-|"
                                            options:0
                                            metrics:nil
                                              views:nameMap];

    NSArray *c2Array =
    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[webView]-45-|"
                                            options:0
                                            metrics:nil
                                              views:nameMap];

    [self.view addConstraints:c1Array];
    [self.view addConstraints:c2Array];

当我使用以下方法进行跟踪时:

po [[UIWindow keyWindow] _autolayoutTrace]

我知道 UIView 和 UIWebView 都有不明确的布局。

我的方法可能有什么问题?

【问题讨论】:

【参考方案1】:

对于控制器的 self.view,您不应将 translatesAutoresizingMaskIntoConstraints 设置为 NO。如果删除该行,则您拥有的约束应该足够了。顺便说一句,格式字符串中不需要零(尽管它们也没有伤害),

这个"H:|[webView]|" 等同于这个"H:|-0-[webView]-0-|"

【讨论】:

以上是关于使用自动布局以编程方式创建视图层次结构的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

基于在 Storyboard 中使用自动布局创建的另一个视图,以编程方式使用框架创建视图

以编程方式使用自动布局的 3 个等高视图

如果使用自动布局以编程方式创建 UIView 会延迟显示

关闭模式视图控制器后,框架不反映自动布局约束

NSLayoutConstraint 的幽灵困扰着我的视图层次结构?