这个问题听起来很简单但却让我发疯。 我在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)
我也尝试了界限,但这并没有帮助。 我可以使用约束来解决问题,但我想了解错误。
答案 0 :(得分:18)
试试这个:
Swift 1和2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3 +:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
如果它不起作用,那么:
iBag.autoresizesSubviews = true
答案 1 :(得分:16)
这么多答案都没有人解释什么是错误的。
我会试试。
您在自动布局引擎开始工作之前,通过超视图框架设置newView
的框架以确定视图位置。因此,当您使用newView
' s superview
的框架时,您使用的初始框架在大多数情况下都不正确。您有3种方法可以做正确的事情:对newView
使用自动布局(约束),或在newView
方法中为viewDidLayoutSubviews
设置框架(当自动布局引擎结束时它会调用,所以帧变为实际;请注意,此方法可以多次调用),或设置newView
答案 2 :(得分:8)
试试这个
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
答案 3 :(得分:2)
试试这个,
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而不是子视图是不好的做法。
答案 4 :(得分:1)
可能会帮助你
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
希望这会对你有所帮助。
答案 5 :(得分:0)
可能会有效: -
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
但在您的情况下,CGRect中的width
和height
应为
width: parentView.bounds.size.width
height: parentView.bounds.size.height
然后将其父级添加为子视图。
答案 6 :(得分: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)
答案 7 :(得分:0)
不使用约束可能是错的。如果您的故事板/笔尖设置为使用AutoLayout(默认情况下处于启用状态),则AutoLayout系统会覆盖设置框架/边界,您必须使用约束来使布局看起来正确。 (或者设置将自动调整大小掩码转换为约束的标志。我不记得那个标志被调用了什么,现在似乎无法找到它。)
答案 8 :(得分:0)
If you are setting up your view in viewdidload, call it in viewdidappear, so it captures the original frame of view, accordingly to the screen size
答案 9 :(得分:0)
尝试使用 applyConstraints
parentView.addSubview(newSubview, applyConstraints: true)