如何设置UIView大小以编程方式匹配没有约束的父级

问题描述 投票:7回答:9

这个问题听起来很容易但却让我发疯。我在IB中创建了一个名为iBag的白色视图,通过约束,它的大小取决于屏幕大小。

enter image description here

现在我想以编程方式创建一个新的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)

enter image description here

我也尝试了界限,但没有帮助。我可以使用约束来解决问题,但我想了解什么是错的。

ios swift uiview cgrect
9个回答
16
投票

如此多的答案,没有人在解释什么是错的。

我会尝试。

在自动布局引擎开始确定您的超级视图位置和大小之前,您正在将newView的框架设置为超级视图框架。因此,当您使用superviews帧时,您正在使用其初始帧。在大多数情况下哪个不正确。

您有3种方法可以正确执行此操作:

  • newView使用autolayout约束
  • newView方法中设置viewDidLayoutSubviewss框架。当autolayout引擎完成确定帧实际值时调用。 (注意:此方法可以多次调用)
  • newView设置自动调整遮罩

18
投票

试试这个:

Swift 1和2:

newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

Swift 3+:

newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

如果它不起作用,也是这样的:

iBag.autoresizesSubviews = true


8
投票

试试这个

subview.frame = parentView.bounds

subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

parentView.addSubview(subview)


3
投票

试试这个,

 override func viewDidLayoutSubviews() {


    newView.frame =  (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))

}

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

因为在viewDidload中你的iBag的框架与你的界面构建器(故事板)中的框架相同。现在它将根据您运行的约束和设备大小进行更改。所以,在viewDidload你的新视图得到旧框架没有改变框架。所以,最好使用viewDidLayoutSubviewsviewWilAppear

第二件事,无论是在任何地方使用autolayout还是在任何地方。在父视图中使用autolayout而不是在子视图中使用autolayout是不好的做法。


2
投票

可能这会对你有所帮助

override func viewDidLayoutSubviews() {

    let newView = UIView()
    newView.frame = iBag.bounds
    newView.addConstraints(iBag.constraints)
    newView.backgroundColor = UIColor.redColor()
    iBag.addSubview(newView)

}

希望这会帮助你。


0
投票

可能这会工作: -

subview.bounds.size = parentView.bounds.size

subview.center = parentView.center

但在你的情况下,CGRect内部的widthheight应该是

width: parentView.bounds.size.width
height: parentView.bounds.size.height

然后将其父级添加为子视图。


0
投票

试试这段代码:

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)

0
投票

不使用约束可能是错的。如果您的故事板/笔尖设置为使用AutoLayout(默认情况下处于启用状态),则AutoLayout系统会覆盖设置框架/边界,您必须使用约束来使布局看起来正确。 (或设置将自动调整大小掩码转换为约束的标志。我不记得该标志被调用了什么,目前似乎无法找到它。)


0
投票

如果您在viewdidload中设置视图,请在viewdidappear中调用它,以便根据屏幕大小捕获原始视图帧

© www.soinside.com 2019 - 2024. All rights reserved.