使用自动布局以编程方式添加背景图像视图

Posted

技术标签:

【中文标题】使用自动布局以编程方式添加背景图像视图【英文标题】:Adding a background imageview programmatically with autolayout 【发布时间】:2014-07-17 05:51:41 【问题描述】:

我需要为我使用故事板 + 自动布局完成的项目的视图添加背景图像视图。我想使用代码以编程方式添加此图像。所以基本上它应该是从顶部布局指南到底部布局指南,而不是在它们之下。我尝试了几种失败的方法。

一种方法是我在添加之前先调整 VC'c 视图

id topGuide = self.topLayoutGuide;
UIView *superView = self.view;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (superView, topGuide);
[self.view addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[superView]"
                                         options:0
                                         metrics:nil
                                           views:viewsDictionary]

 ];
[self.view layoutSubviews];

但由于某种原因,我的图像视图仍然在状态栏下。

这就是我添加 bg imageview 的方式

self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default"]];
self.backgroundView.contentMode = UIViewContentModeTop;
[self.view insertSubview:self.backgroundView atIndex:0];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[backgroundImageView]|" options:0 metrics:nil views:@@"backgroundImageView":self.backgroundView]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[backgroundImageView]|" options:0 metrics:nil views:@@"backgroundImageView":self.backgroundView]];

【问题讨论】:

【参考方案1】:

self.view加上topLayoutGuide相关的约束是没用的。视图控制器独立于 AutoLayout 布局其根视图 (self.view),并将覆盖约束效果(不要引用我的话,这是一个观察,而不是对布局系统的真正理解)。

相反,将第一个约束 (@"V:[topGuide]-20-[superView]") 添加到 self.backgroundView

self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default"]];
self.backgroundView.contentMode = UIViewContentModeTop;
[self.view insertSubview:self.backgroundView atIndex:0];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-(20)-[backgroundImageView]|" options:0 metrics:nil views:@@"backgroundImageView":self.backgroundView, @"topGuide": self.topLayoutGuide]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[backgroundImageView]|" options:0 metrics:nil views:@@"backgroundImageView":self.backgroundView]];
[self.view layoutSubviews];

【讨论】:

以上是关于使用自动布局以编程方式添加背景图像视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在子类 UIView 的子视图上自动布局

iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView

以编程方式将自动布局添加到肋骨中添加的现有自动布局视图

以编程方式布局 UIScrollView,并为其子视图添加了自动布局,但它不滚动

自动布局约束没有得到尊重

如何以编程方式使用自动布局以编程方式添加 UIview?