In reading the View Programming Guide from Apple it is apparent they have not updated it for constraints. So a couple of questions:
-
Many posts here talk about NOT using -initWithFrame when initializing a new UIView or setting it to CGRectZero or some equivalent. How would you handle this then?:
-(id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self){ //Set up rounded rectangle ivar CGRect frame = [self bounds]; CGFloat radius = frame.size.height / 2; _rectPath = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius]; } }and then putting the drawing code in the drawRect:. I have found that it won’t init properly without a frame. (Obviously, I’m initing this UIView and immediately setting constraints but no frame immediately). This code set’s frame = (0,0,0,0) because constraints haven’t been computed yet.
If we don’t put this code in init where would we put it? Also, I thought it was good practice to init all our stuff we needed in the view in init.
So this leads to question…
-
When is -updateConstraints called in the runtime cycle and when does the view compute it’s bounds using those constraints? I have noticed that the view really doesn’t know what it’s bounds are until after -layoutSubviews. Is there another place before this that the UIView knows it’s bounds if it has only been set with constraints?
Sorry about all the questions, but they all kinda seem connected. Thanks for the looks.
Your problem with your frames is not related to auto layout. View size changes all the time. It is almost never the same as during object instantiation. You need to create/calculate the size of paths to fit the current size during drawRect, not when you first create the view.
The only objects you should set during
initare properties and/or ivars that the rest of your class relies on existing in a certain state.