如何设置UIView大小以编程方式无约束地匹配parrent

这个问题听起来很简单,但却让我发疯。 我已经在IB中创build了一个叫做iBag的白色视图,而且它的大小取决于屏幕大小。

在这里输入图像说明

现在,我想以编程方式创build一个新的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框架,你使用初始框架,在大多数情况下不正确。 你有三种方法可以做正确的事情:为你的newView使用自动布局(约束),或者在viewDidLayoutSubviews方法中设置newView框架(它在自动布局引擎结束它的时候调用,所以帧变成实际的;注意这个方法可以被称为多个次),或者为newView设置自动调整掩码

尝试这个:

newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

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

iBag.autoresizesSubviews = true

尝试这个

subview.frame = parentView.bounds

subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

parentView.addSubview(subview)

可能这会帮助你

 override func viewDidLayoutSubviews() { let newView = UIView() newView.frame = iBag.bounds newView.addConstraints(iBag.constraints) newView.backgroundColor = UIColor.redColor() iBag.addSubview(newView) } 

希望这会帮助你。

尝试这个,

  override func viewDidLayoutSubviews() { newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height)) } 

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

因为在你的界面生成器(storyboard)中viewDidload你的iBag的框架是一样的。 现在它将根据您的约束和您运行的设备大小而改变。 因此,在viewDidload你的新视图得到旧的帧没有改变的框架。 所以,最好使用viewDidLayoutSubviewsviewWilAppear

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

可能会这样做: –

 subview.bounds.size = parentView.bounds.size subview.center = parentView.center 

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

 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系统会覆盖设置框架/边框,并且您必须使用约束来使布局看起来正确。 (或设置将自动resize的掩码转换为约束的标志,我不记得那个标志被调用了,目前似乎无法find它)。