在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。

首先 ,请不要使用setFramesetBounds因为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]); } }