2

我有一个简单的 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
}

如何在没有任何视觉故障的情况下显示视图之前更新标签的中心?

4

1 回答 1

5

我认为,您正在使用autoLayout您的 xib。

在此处输入图像描述

在我的脑海中,我有两个解决方案。

第一个是,请不要使用,setFrame否则 会跳过它们。setBoundsAutolayout

更改约束是最好的解决方案。您还可以添加/删除额外的约束。

WWDC 2012 中提供了一个关于调整的优秀视频 教程。Autolayout

在此处输入图像描述

第二个是,Implement viewDidLayoutSubviews,它会在视图控制器的视图 layoutSubviews 方法被调用后调用。

- (void)viewDidLayoutSubviews
{
    @try
    {
         // reset label frame here.
    }
    @catch (NSException *exception)
    {
        NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]);
    }
}
于 2013-03-17T07:06:51.037 回答