如何设置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)) }
或者你可以使用viewWillAppear
或viewDidAppear
来设置框架。
因为在你的界面生成器(storyboard)中viewDidload
你的iBag的框架是一样的。 现在它将根据您的约束和您运行的设备大小而改变。 因此,在viewDidload
你的新视图得到旧的帧没有改变的框架。 所以,最好使用viewDidLayoutSubviews
或viewWilAppear
。
第二件事情, 无论是在任何地方或无处使用自动布局 。 在父视图中使用自动布局是不好的做法,而不是在子视图中使用。
可能会这样做: –
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系统会覆盖设置框架/边框,并且您必须使用约束来使布局看起来正确。 (或设置将自动resize的掩码转换为约束的标志,我不记得那个标志被调用了,目前似乎无法find它)。