I have a simple UIViewController which has a corresponding .xib file.
ViewController *v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:v animated:YES];
In this .xib file, I have a UILabel, which is positioned in the middle of the screen. I would like to move this label to a new position once the view is loaded, but before it is visible:
label.center = CGPointMake(0,0);
When I try putting the above code in the following methods, this is what happens:
initWithNibName:bundle
: position doesn't updateawakeFromNib
: position doesn't updateviewDidLoad
: position doesn't updateviewWillAppear
: position doesn't updateviewDidAppear
: position only updates after the view is fully loaded (i.e. the label's original position can be seen for a split second).
When I try updating something like the text property:
label.text = @"Foo";
... it works in all of these methods. For some reason, it is only the position that gets overridden by the .xib file.
When I say that "position doesn't update" I mean that when the label is shown on the screen, it is in the location defined in the .xib file rather than the one I am trying to override it with.
When I try to NSLog
the position, it shows that it updates it correctly, but then when I check the position again in viewDidAppear
, it shows the incorrect value. For example, say the .xib defines the x at 99, and I want to change it to 0:
- (void)viewWillAppear:(BOOL)animated {
label.center = CGPointMake(0,0);
NSLog(@"%f", label.center.x); // reports 0
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%f", label.center.x); // reports 99 (Error: should be 0)
label.center = resultLabelHiddenCenter;
NSLog(@"%f", label.center.x); // reports 0
}
How can I update the label's center before the view is shown without any visual glitches?
I think , You are using
autoLayout
for your xib.I have two solutions for you in my mind.
First one is , please don't use
setFrame
orsetBounds
becauseAutolayout
will skip them.Changing the constraints is the best solution .You can also add/remove extra constraints.
A good video tutorial is available in WWDC 2012 regarding
Autolayout
adjustments.Second one is,Implement
viewDidLayoutSubviews
which will call just after the view controller's view's layoutSubviews method is invoked.