加载uiviewcontroller后更新xib视图的位置?

Sen*_*ful 2 uiviewcontroller ios

我有一个简单的UIViewController,它有一个相应的.xib文件.

ViewController *v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:v animated:YES];
Run Code Online (Sandbox Code Playgroud)

在这个.xib文件中,我有一个UILabel,它位于屏幕中间.我想在加载视图后将此标签移动到新位置,但在可见之前:

label.center = CGPointMake(0,0);
Run Code Online (Sandbox Code Playgroud)

当我尝试将以上代码放在以下方法中时,会发生以下情况:

  • initWithNibName:bundle:位置不更新
  • awakeFromNib:位置不更新
  • viewDidLoad:位置不更新
  • viewWillAppear:位置不更新
  • viewDidAppear:位置仅在视图完全加载后更新(即标签的原始位置可以瞬间看到).

当我尝试更新text属性时:

label.text = @"Foo";
Run Code Online (Sandbox Code Playgroud)

......它适用于所有这些方法.出于某种原因,它只是被.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
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_* TK 5

我想,你正在使用autoLayout你的xib.

在此输入图像描述

在我看来,我有两个解决方案.

首先是,请不要使用setFramesetBounds因为Autolayout 会跳过它们.

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

关于调整,WWDC 2012提供了一个很好的视频 教程Autolayout.

在此输入图像描述

第二个是,viewDidLayoutSubviews在调用视图控制器的视图的layoutSubviews方法之后调用的实现.

- (void)viewDidLayoutSubviews
{
    @try
    {
         // reset label frame here.
    }
    @catch (NSException *exception)
    {
        NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]);
    }
}
Run Code Online (Sandbox Code Playgroud)