我有一个简单的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
:位置仅在视图完全加载后更新(即标签的原始位置可以暂时显示)。当我尝试更新类似文本属性的内容时:
label.text = @"Foo";
......它适用于所有这些方法。出于某种原因,只有被.xib文件覆盖的位置。
当我说“位置不更新”时,我的意思是当屏幕上显示标签时,它位于.xib文件中定义的位置,而不是我试图用它覆盖的位置。 / p>
当我尝试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
}
如何在显示视图之前更新标签的中心而没有任何视觉故障?
答案 0 :(得分:5)
我认为,你正在使用autoLayout
作为你的xib。
在我看来,我有两个解决方案。
第一个,请不要使用setFrame
或setBounds
,因为Autolayout
会跳过它们。
更改约束是最佳解决方案。您还可以添加/删除额外约束。
WWDC 2012提供了一个关于Autolayout
调整的好视频tutorial。
第二个,实现viewDidLayoutSubviews
,它将在调用视图控制器的视图的layoutSubviews方法之后调用。
- (void)viewDidLayoutSubviews
{
@try
{
// reset label frame here.
}
@catch (NSException *exception)
{
NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]);
}
}