2013-03-17 102 views
2

我有一個簡單的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:位置不更新
  • 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 
} 

如何我可以更新標籤的中心,沒有任何毛刺視覺顯示視圖前?

+0

您是否在使用autolayout? – 2013-03-17 06:55:06

回答

5

我認爲,您正在爲您的xib使用autoLayout

enter image description here

我對你有兩種解決方案在我的腦海裏。

第一個是,請不要使用setFramesetBounds因爲Autolayout會跳過他們。

更改約束是最好的解決方案。您還可以添加/刪除額外的約束。

有關Autolayout調整的好視頻tutorial可在WWDC 2012中找到。

enter image description here

第二個是,實現viewDidLayoutSubviews它將調用調用視圖控制器的視圖的layoutSubviews方法之後。

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