如何以编程方式设置 UIView 大小以无约束地匹配父级
How to set UIView size to match parent without constraints programmatically
这个问题听起来很简单,但它让我抓狂。
我在 IB 中创建了一个名为 iBag 的白色视图,由于限制,它的大小取决于屏幕大小。
现在我想以编程方式创建一个新的 UIView,并通过此代码将其作为子视图添加到具有相同大小和位置的 iBag
let newView = UIView()
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
我也试过 bounds 但没有用。
我可以使用约束来解决问题,但我想了解问题所在。
可能这会起作用:-
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
但在您的情况下,CGRect 中的 width
和 height
应该是
width: parentView.bounds.size.width
height: parentView.bounds.size.height
然后添加到它的父视图作为子视图。
试试这个:
Swift 1 和 2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3+:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
如果不行,还有这个:
iBag.autoresizesSubviews = true
也许这会对你有所帮助
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
希望对您有所帮助。
试试这个代码:
let newView = UIView()
newView.frame = (frame: CGRect(x: iBag.frame.origin.x, y: iBag.frame.origin.y, width: iBag.frame.size.width, height: iBag.frame.size.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
试试这个
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
这么多答案,却没有人解释哪里出了问题。
我会努力的
您正在将 newView
的框架设置为您的超级视图框架 ,然后 自动布局引擎开始确定您的超级视图位置和大小。因此,当您使用 superviews
框架时,您正在使用它的初始框架。在大多数情况下这是不正确的。
你有 3 种方法可以正确做到:
为您的newView
使用自动布局约束
在viewDidLayoutSubviews
方法中设置newView
s帧。哪个是
当自动布局引擎完成确定帧的实际值时调用。 (注:此方法可多次调用)
- 为
newView
设置自动调整掩码
不使用约束可能是问题所在。如果您的 storyboard/nib 设置为使用 AutoLayout(默认情况下启用),则设置 frames/bounds 会被 AutoLayout 系统覆盖,您必须使用约束来使布局看起来正确。 (或设置将自动调整大小掩码转换为约束的标志。我不记得那个标志叫什么,目前似乎无法找到它。)
试试这个,
override func viewDidLayoutSubviews() {
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
}
或者您可以使用viewWillAppear
或viewDidAppear
设置框架。
因为在 viewDidload
中,您的 iBag 框架与您的界面生成器(故事板)中的框架相同。现在它会根据您的约束条件和您 运行 所在的设备大小而改变。因此,在 viewDidload
中,您的新视图得到旧框架而不是更改框架。所以,最好使用 viewDidLayoutSubviews
或 viewWilAppear
.
第二件事,要么在任何地方使用自动布局,要么在任何地方使用自动布局。在父视图中使用自动布局而不是子视图是不好的做法。
如果您在 viewdidload 中设置视图,请在 viewdidappear 中调用它,因此它会根据屏幕尺寸捕获原始视图框架
尝试使用applyConstraints
parentView.addSubview(newSubview, applyConstraints: true)
这个问题听起来很简单,但它让我抓狂。 我在 IB 中创建了一个名为 iBag 的白色视图,由于限制,它的大小取决于屏幕大小。
现在我想以编程方式创建一个新的 UIView,并通过此代码将其作为子视图添加到具有相同大小和位置的 iBag
let newView = UIView()
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
我也试过 bounds 但没有用。 我可以使用约束来解决问题,但我想了解问题所在。
可能这会起作用:-
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
但在您的情况下,CGRect 中的 width
和 height
应该是
width: parentView.bounds.size.width
height: parentView.bounds.size.height
然后添加到它的父视图作为子视图。
试试这个:
Swift 1 和 2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3+:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
如果不行,还有这个:
iBag.autoresizesSubviews = true
也许这会对你有所帮助
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
希望对您有所帮助。
试试这个代码:
let newView = UIView()
newView.frame = (frame: CGRect(x: iBag.frame.origin.x, y: iBag.frame.origin.y, width: iBag.frame.size.width, height: iBag.frame.size.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
试试这个
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
这么多答案,却没有人解释哪里出了问题。
我会努力的
您正在将 newView
的框架设置为您的超级视图框架 ,然后 自动布局引擎开始确定您的超级视图位置和大小。因此,当您使用 superviews
框架时,您正在使用它的初始框架。在大多数情况下这是不正确的。
你有 3 种方法可以正确做到:
为您的
newView
使用自动布局约束
在
viewDidLayoutSubviews
方法中设置newView
s帧。哪个是 当自动布局引擎完成确定帧的实际值时调用。 (注:此方法可多次调用)- 为
newView
设置自动调整掩码
不使用约束可能是问题所在。如果您的 storyboard/nib 设置为使用 AutoLayout(默认情况下启用),则设置 frames/bounds 会被 AutoLayout 系统覆盖,您必须使用约束来使布局看起来正确。 (或设置将自动调整大小掩码转换为约束的标志。我不记得那个标志叫什么,目前似乎无法找到它。)
试试这个,
override func viewDidLayoutSubviews() {
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
}
或者您可以使用viewWillAppear
或viewDidAppear
设置框架。
因为在 viewDidload
中,您的 iBag 框架与您的界面生成器(故事板)中的框架相同。现在它会根据您的约束条件和您 运行 所在的设备大小而改变。因此,在 viewDidload
中,您的新视图得到旧框架而不是更改框架。所以,最好使用 viewDidLayoutSubviews
或 viewWilAppear
.
第二件事,要么在任何地方使用自动布局,要么在任何地方使用自动布局。在父视图中使用自动布局而不是子视图是不好的做法。
如果您在 viewdidload 中设置视图,请在 viewdidappear 中调用它,因此它会根据屏幕尺寸捕获原始视图框架
尝试使用applyConstraints
parentView.addSubview(newSubview, applyConstraints: true)