如何设置UIView大小以匹配parrent而不受编程限制

时间:2016-06-09 12:00:26

标签: ios swift uiview cgrect

这个问题听起来很简单但却让我发疯。 我在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

我也尝试了界限,但这并没有帮助。 我可以使用约束来解决问题,但我想了解错误。

10 个答案:

答案 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))

}

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

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

第二件事,在任何地方或无处使用自动布局。在父视图中使用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中的widthheight应为

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)