2013-04-09 76 views
1

在我viewDidLoad,我調用一個函數:viewDidLoad方法調用行爲

[common startActivityIndicatorOnView:self.view]; 

此方法添加與活動指示燈視圖,在self.view中心。 我的當前視圖被推送到導航堆棧上。這是該視圖中查找此方法返回後(活動指示燈的觀點是不是在中心): enter image description here

但是,如果我調用相同的方法是這樣的:

[common performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:self.view waitUntilDone:NO]; 

的觀點看起來像下面的圖片(活動指示燈的觀點是在中心):

enter image description here

我不明白,它是如何有所作爲,如果主叫用戶線是寫在viewDidLoad。 如果有人能幫助我得到這個,請提前致謝。

僅供參考, 的方法是這樣的:當你加載viewControllers

-(void) startActivityIndicatorOnView:(UIView *)view { 
    if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop]) { 
     [self performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:view waitUntilDone:NO]; 
     return; 
    } 
    view.userInteractionEnabled = NO; 
    activityBgView = [[UIView alloc] initWithFrame:CGRectMake((view.frame.size.width/2) - 50, (view.frame.size.width/2) - 50, 100, 100)]; 
    activityBgView.center = view.center; 
    activityBgView.backgroundColor = [UIColor grayColor]; 
    activityBgView.alpha = 0.8; 
    spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake((activityBgView.frame.size.width/2)-10, (activityBgView.frame.size.width/2)-10, 20, 20)]; 
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
    spinner.center = view.center; 

    [view addSubview:activityBgView]; 
    [view addSubview:spinner]; 
    [spinner startAnimating]; 
} 
+0

嘗試self.navigationController.view代替self.view。 – satheeshwaran 2013-04-09 10:20:15

+0

@Pince我已經知道調用'performSelectorOnMainThread'調用主線程中的方法。但我在'viewDidLoad'中這樣做,它本身在主線程中調用。所以,應該沒有區別。 – 2013-04-09 11:26:28

回答

0

viewDidLoad中被調用(通過筆尖/廈門國際銀行或的loadView方法以編程方式創建的),這意味着Xcode中創建所有視圖和實例或Alloc在廈門國際銀行的所有對象...

但是,您的viewController視圖(和子視圖)仍然沒有在任何視圖中添加...

yourViewController.view.superView = nil; 

因此,它的視圖已經獲得了您在xib中設置的框架,但是如果您告訴它在其超級視圖內調整大小,那麼添加它時(例如,推或增加視圖),其框架更改,但您的微調不會改變其位置。

調用performSelectorOnMainThread只是稍後調用你的方法,當你的當前線程前進,並可能推動你的viewController.view,所以,執行時,你的ViewController.view.superView存在,所以view.frame已經改變。

嘗試將呼叫轉移到

[common startActivityIndicatorOnView:self.view]; 

在viewWillAppear中的方法:在這一點上應該yourViewController.view已經被調整大小以適應它的父

編輯:

@帕維爾問題:

之後什麼媽咪你的viewcontroller.view.superView將不是零?

banally:當您將其視圖添加到視圖。也就是說,firts你分配和(用筆尖或通過代碼INIT)初始化它

類似:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil]; 
在這一點上

在你的類中的方法viewDidLoad被稱爲(但yourViewController.view.superview 0無)

後,您通常使用新的viewController,所以在navigationController的堆棧你「推」,或者你只需​​要添加的查看到當前viewController.view ...類似:

[currentViewController.view addSubview:yourViewController.view]; 

在這一行之後,您可能會想象,yourViewController.view.superView = currentViewController.view,並調用了yourViewController的方法viewWillAppear,因此您可以在其中使用superView。

請注意,此時viewController.view在屏幕上仍然不可見,因此您可以在此處調整大小,移動或添加視圖,而無需用戶查看任何更改。

在此之後,yourViewController將顯示,並且在結束時,和該方法的yourViewController viewDidAppear被稱爲(爲任何其他代碼,萬一)

+0

邏輯:)。在viewWillAppear,它的工作。 – 2013-04-09 11:31:45

+0

什麼時候你的ViewController.view.superView將不是零? – BergP 2013-04-09 11:37:23

+0

@Pavel:看看我的新廣告(給我一分鐘) – meronix 2013-04-09 11:41:30