这个问题听起来很容易但却让我发疯。我在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)
我也尝试了界限,但没有帮助。我可以使用约束来解决问题,但我想了解什么是错的。
如此多的答案,没有人在解释什么是错的。
我会尝试。
在自动布局引擎开始确定您的超级视图位置和大小之前,您正在将newView
的框架设置为超级视图框架。因此,当您使用superviews
帧时,您正在使用其初始帧。在大多数情况下哪个不正确。
您有3种方法可以正确执行此操作:
newView
使用autolayout约束newView
方法中设置viewDidLayoutSubviews
s框架。当autolayout引擎完成确定帧实际值时调用。 (注意:此方法可以多次调用)newView
设置自动调整遮罩试试这个:
Swift 1和2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3+:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
如果它不起作用,也是这样的:
iBag.autoresizesSubviews = true
试试这个
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
试试这个,
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
。
第二件事,无论是在任何地方使用autolayout还是在任何地方。在父视图中使用autolayout而不是在子视图中使用autolayout是不好的做法。
可能这会对你有所帮助
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
希望这会帮助你。
可能这会工作: -
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
但在你的情况下,CGRect内部的width
和height
应该是
width: parentView.bounds.size.width
height: parentView.bounds.size.height
然后将其父级添加为子视图。
试试这段代码:
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)
不使用约束可能是错的。如果您的故事板/笔尖设置为使用AutoLayout(默认情况下处于启用状态),则AutoLayout系统会覆盖设置框架/边界,您必须使用约束来使布局看起来正确。 (或设置将自动调整大小掩码转换为约束的标志。我不记得该标志被调用了什么,目前似乎无法找到它。)
如果您在viewdidload中设置视图,请在viewdidappear中调用它,以便根据屏幕大小捕获原始视图帧