如何设置UIView大小,以编程方式无约束地匹配parrent
这个问题听起来很容易,但它让我发疯。 我在IB中创建了一个名为iBag的白色视图,并且它的大小取决于屏幕大小。如何设置UIView大小,以编程方式无约束地匹配parrent
现在我想以编程方式创建一个新的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
的superview
帧时,你会使用初始帧,这在大多数情况下都不正确。你有3种方法可以做正确的事情:为你的newView
使用自动布局(约束),或者在viewDidLayoutSubviews
方法中设置newView
的帧(它在自动布局引擎结束它的时候调用,所以帧变成实际的;注意这个方法可以被称为多重或者设置自动调整掩码为newView
可能是这将工作: -
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
但在你的情况下,width
和height
在里面的CGRect应
width: parentView.bounds.size.width
height: parentView.bounds.size.height
,然后添加到它的父为子视图。
不,结果相同。 – Seifolahi
试试这个:
斯威夫特1和2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
斯威夫特3+:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
如果它不工作,也这样:
iBag.autoresizesSubviews = true
第一行works.tnx – Seifolahi
可能,这将帮助你
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
希望这会帮助你。
试试这个代码:
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)
试试这个
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
不使用约束可能是什么错误。如果您的故事板/笔尖设置为使用AutoLayout(默认情况下处于启用状态),则AutoLayout系统会覆盖设置帧/边框,并且您必须使用约束来使布局看起来正确。 (或设置自动调整大小面具转换为约束的旗帜。我不记得是什么标志被称为似乎并不能在此刻找到它。)
试试这个,
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
。
第二件事,无论是使用自动布局还是无处不在。在父视图中使用自动布局是不好的做法,而不是在子视图中使用。
这不是一个好的解决方案,因为viewDidLayoutSubviews被多次调用。所以会创建许多“新视图”。 –
对呀@ jn-se编辑我的答案!现在,我觉得很好 – Lion
你在哪里实例化ViewWillAppear中的新视图? –
@SandeepBhandari In viewDidLoad – Seifolahi
你可以在ViewDidAppear中试试吗? –