问题
The problem sounds easy but it is making me crazy. I've created a white view in IB that's called iBag and by constraints it's size depends on screen size.
Now I want create a new UIView programmatically and add as subview to iBag with same size and position by this code
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)
I also tried bounds but that didn't help. I can use constraints to solve the problem but i want to understand what's wrong.
回答1:
So many answers and nobody is explaining what's wrong.
I will try.
You are setting the frame of newView
to your superviews frame before the autolayout engine has started to determine your superviews position and size. So, when you use the superviews
frame, you are using its initial frame. Which is not correct in most cases.
You have 3 ways to do it correctly:
Use autolayout constraints for your
newView
Set
newView
s frame in theviewDidLayoutSubviews
method. Which is called when the autolayout engine finishes determining the frames actual values. (Note: This method can be called multiple times)- Set an autoresizing mask for
newView
回答2:
Try this:
Swift 1 and 2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3+:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
If it doesn't work, also this:
iBag.autoresizesSubviews = true
回答3:
Try this
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
回答4:
Try this,
override func viewDidLayoutSubviews() {
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
}
or you can use viewWillAppear
or viewDidAppear
to set frame.
Because in viewDidload
your iBag's frame is same which is in your interface builder (storyboard). Now it will change according to your constraints and device size on which you run. So, in viewDidload
your new view get old frame not changed frame. So, it's better to use viewDidLayoutSubviews
or viewWilAppear
.
Second thing, Either use autolayout everywhere or nowhere. It is bad practice to use autolayout in parent view and not to child.
回答5:
May be this will help you
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
Hope this will help you.
回答6:
may be this will work:-
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
but in your case, width
and height
inside the CGRect should be
width: parentView.bounds.size.width
height: parentView.bounds.size.height
and then add to it's parent as subview.
回答7:
try this code:
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)
回答8:
Not using constraints is likely what's wrong. If your storyboard/nib is set to use AutoLayout (which is on by default) then setting frames/bounds gets overridden by the AutoLayout system and you HAVE TO use constraints to get your layout to look right. (or set the flag that converts auto resizing masks to constraints. I don't remember what that flag is called and can't seem to find it at the moment.)
回答9:
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
来源:https://stackoverflow.com/questions/37725406/how-to-set-uiview-size-to-match-parent-without-constraints-programmatically