在uiviewcontroller加载后更新xib视图的位置?
我有一个简单的UIViewController,它有一个相应的.xib文件。
ViewController *v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:v animated:YES];
在这个.xib文件中,我有一个位于屏幕中间的UILabel。 一旦视图被加载,我想将这个标签移动到一个新的位置,但在可见之前:
label.center = CGPointMake(0,0);
当我尝试把上面的代码放在下面的方法中时,会发生什么情况:
-
initWithNibName:bundle
:position不更新 -
awakeFromNib
:位置不更新 -
viewDidLoad
:位置不更新 -
viewWillAppear
:位置不更新 -
viewDidAppear
:位置只在视图完全加载后才更新(即可以在一秒钟内看到标签的原始位置)。
当我尝试更新像文本属性的东西:
label.text = @"Foo";
它在所有这些方法中都有效 出于某种原因,它只是被.xib文件覆盖的位置。
当我说“位置不更新”我的意思是,当标签显示在屏幕上时,它是在.xib文件中定义的位置,而不是我试图重写的位置。
当我尝试NSLog
的位置,它表明它正确地更新它,但是当我再次检查位置viewDidAppear
,它显示不正确的值。 例如,假设.xib在99处定义了x,我想将其更改为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 }
在显示视图之前,如何更新标签的中心?
我想,你正在为你的xib使用autoLayout。
在我看来,我有两个解决scheme。
首先 ,请不要使用setFrame
或setBounds
因为Autolayout
会跳过它们。
更改约束是最好的解决scheme。您也可以添加/删除额外的约束。
WWDC 2012提供了一个关于Autolayout
调整的好video教程 。
第二个是实现viewDidLayoutSubviews
,它将在调用视图控制器视图的layoutSubviews方法之后立即调用。
- (void)viewDidLayoutSubviews { @try { // reset label frame here. } @catch (NSException *exception) { NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]); } }