我有一个简单的 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
: 位置不更新awakeFromNib
: 位置不更新viewDidLoad
: 位置不更新viewWillAppear
: 位置不更新viewDidAppear
: 位置仅在视图完全加载后更新(即标签的原始位置可以在一瞬间看到)。
当我尝试更新类似 text 属性的内容时:
label.text = @"Foo";
...它适用于所有这些方法。出于某种原因,它只是被 .xib 文件覆盖的位置。
当我说“位置不更新”时,我的意思是当标签显示在屏幕上时,它位于 .xib 文件中定义的位置,而不是我试图覆盖它的位置。
当我尝试到NSLog
该位置时,它显示它正确更新它,但是当我再次检查该位置时viewDidAppear
,它显示不正确的值。例如,假设 .xib 将 x 定义为 99,我想将其更改为 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
}
如何在没有任何视觉故障的情况下显示视图之前更新标签的中心?