9

我試圖子視圖控制器添加到包含在UINavigationController這個代碼UIViewController子視圖控制器添加到UINavigationController的

- (void)buttonTapped:(id)sender 
{ 
    MyChildController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyChild"]; 
    [self addChildViewController:viewController]; 
    [self.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self]; 


    viewController.view.alpha = 0.0f; 
    [UIView animateWithDuration:0.4 animations:^{ 
     viewController.view.alpha = 1.0f; 
    }]; 
} 

不過這是結果:

Image Result

正如你所看到的,UINavigatioBarUIToolbar仍然在子視圖控制器之上。我怎樣才能把子視圖控制器放在最重要的位置?我已經試過,以取代代碼:

[self.navigationController addChildViewController:viewController]; 
    [self.navigationController.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self.navigationController]; 

但這種方式的viewControllerviewDidAppear:animated不會被調用,不知道爲什麼。

回答

5

在你的第一個視圖控制器,做這樣的事情:

- (IBAction)buttonClick:(id)sender 
{ 
    SecondViewController *secondView = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    UIImage *blurryImage = [UIImage imageNamed:@"foo.jpeg"]; 
    secondView.imageView.image = blurryImage; 
    [self.navigationController addChildViewController:secondView]; 
    secondView.view.frame = self.navigationController.view.frame; 
    [self.navigationController.view addSubview:secondView.view]; 
} 

然後在你的第二個視圖控制器,添加吸收劑您的ImageView:

-(UIImageView *)imageView 
{ 
    if(_imageView == nil) 
    { 
     _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)]; 
     [self.view addSubview:_imageView]; 
    } 
    return _imageView; 
} 
+0

我想,因爲我需要模糊模式視圖的背景視圖使用視圖 - 控制容器的方法控制器也是半透明的。效果與您從屏幕頂部拉下的通知視圖相同。背景是半透明的,也是模糊/磨砂玻璃。爲什麼如果我添加一個子視圖控制器到'self.navigationController','viewDidAppear'方法不被調用? –

+0

嗯......不太確定...你有沒有試過調用[viewController viewWillAppear:NO]? – JonahGabriel

+1

是的,它什麼都不做。我需要在行['viewController didMoveToParentViewController:self.navigationController]'後面調用'[viewController viewDidAppear:NO]'。爲什麼這些方法不被調用?否則,如果我將子視圖控制器添加到'self'而不是'self.navigationController',它會起作用,但是如上圖所示,視圖在'navigationController'內部。 –

28

@Sam的評論是正確的。您需要撥打beginApperanceTransition:animated:endAppearanceTransition來觸發viewDidAppear。當您添加子視圖控制器時,UINavigationController不會調用viewDidAppear的原因是因爲它已覆蓋其容器組合方法,以防止程序員在奇怪的位置添加子視圖控制器。在你的情況下,它不希望你的子視圖掩蓋導航欄。導航控制器的正確用法是讓孩子出現在導航欄下。儘管如此,您仍然可以通過手動通知孩子何時出現以及何時完成出現,強制使用此非標準用戶界面。

添加一個孩子的UINavigationController

MyChildViewController* child = [[MyChildViewController alloc] init]; 
[self.navigationController addChildViewController:child]; 
child.view.frame = self.navigationController.view.bounds; 
[self.navigationController.view addSubview:child.view]; 
child.view.alpha = 0.0; 
[child beginAppearanceTransition:YES animated:YES]; 
[UIView 
    animateWithDuration:0.3 
    delay:0.0 
    options:UIViewAnimationOptionCurveEaseOut 
    animations:^(void){ 
     child.view.alpha = 1.0; 
    } 
    completion:^(BOOL finished) { 
     [child endAppearanceTransition]; 
     [child didMoveToParentViewController:self.navigationController]; 
    } 
]; 

從UINavigationController的

刪除子
[child willMoveToParentViewController:nil]; 
[child beginAppearanceTransition:NO animated:YES]; 
[UIView 
    animateWithDuration:0.3 
    delay:0.0 
    options:UIViewAnimationOptionCurveEaseOut 
    animations:^(void){ 
     child.view.alpha = 0.0; 
    } 
    completion:^(BOOL finished) { 
     [child endAppearanceTransition]; 
     [child.view removeFromSuperview]; 
     [child removeFromParentViewController]; 
    } 
]; 
+1

我想孩子被調用'didMoveToParentViewController:'當它被刪除..類似於,'[child didMoveToParentViewController:nil]' –

+0

它幫助了我......謝謝。提高普沃納。 – Femina

+0

非常有幫助,謝謝! – kernix

相關問題