如何以编程方式设置 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 中的 widthheight 应该是

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方法中设置newViews帧。哪个是 当自动布局引擎完成确定帧的实际值时调用。 (注:此方法可多次调用)

  • 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))

}

或者您可以使用viewWillAppearviewDidAppear设置框架。

因为在 viewDidload 中,您的 iBag 框架与您的界面生成器(故事板)中的框架相同。现在它会根据您的约束条件和您 运行 所在的设备大小而改变。因此,在 viewDidload 中,您的新视图得到旧框架而不是更改框架。所以,最好使用 viewDidLayoutSubviewsviewWilAppear.

第二件事,要么在任何地方使用自动布局,要么在任何地方使用自动布局。在父视图中使用自动布局而不是子视图是不好的做法。

如果您在 viewdidload 中设置视图,请在 viewdidappear 中调用它,因此它会根据屏幕尺寸捕获原始视图框架

尝试使用applyConstraints

parentView.addSubview(newSubview, applyConstraints: true)