您的位置:首页 > 产品设计 > UI/UE

Add child view controller to UINavigationController

2015-12-18 17:48 1641 查看
http://stackoverflow.com/questions/19257999/add-child-view-controller-to-uinavigationcontroller
I'm trying to add a child view controller to a 
UIViewController
 contained
in a 
UINavigationController
 with
this code:
- (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;
}];
}


But this is the result:



As you can see the 
UINavigatioBar
 and
the 
UIToolbar
 are
still on top of the child view controller. How can I put the child view controller on top of all? I've already tried to replace the code with:
[self.navigationController addChildViewController:viewController];
[self.navigationController.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self.navigationController];


But in this way the 
viewDidAppear:animated
 of
the 
viewController
 doesn't
get called, dunno why.

iphone objective-c uiviewcontroller ios7 childviewcontroller
shareimprove
this question
edited Jan
21 at 15:38





Community
1

asked Oct 8 '13 at 20:44





Fred Collins
1,15693488

 add
a comment


2 Answers

activeoldestvotes

up vote5down
voteaccepted
In your first view controller, do something like this:
- (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];
}


Then in your second view controller, add the getter for your imageview:
-(UIImageView *)imageView
{
if( _imageView == nil )
{
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)];
[self.view addSubview:_imageView];
}
return _imageView;
}


shareimprove
this answer
edited Oct
9 '13 at 0:52

answered Oct 8 '13 at 23:05





JonahGabriel
2,2871719

 
 
I'm trying to use the viewcontroller-container approach because I need to blur the background view of the modal view
controller that is also semi-transparent. The effect is the same as notification view that you pull down from the top of the screen. The background is semi-transparent and it's also blur/frosted glass. Why if I add a child view controller to 
self.navigationController
 the 
viewDidAppear
 method
is not called? – Fred
Collins Oct
8 '13 at 23:21
 
Hmm...not quite sure...have you tried calling [viewController viewWillAppear:NO]? – JonahGabriel Oct
8 '13 at 23:38
 
Yes and it does nothing. I need to call 
[viewController
viewDidAppear:NO]
 just after the line
[viewController
didMoveToParentViewController:self.navigationController]
. Why the hell the methods are not called? Otherwise if I add the child view controller to 
self
 and
not
self.navigationController
 it
works but as showed in the above image the view is 'inside' the
navigationController
. – Fred
Collins Oct
8 '13 at 23:44
 
So I just coded up a simple case of your problem and it looks like viewDidLoad is getting called. Why not put your logic
in there? I am imagining you are deallocating your view when it gets hidden right? – JonahGabrielOct
8 '13 at 23:51
3 
In order for 
viewWillAppear:
 and 
viewDidAppear:
 to
be called, you need to send the message 
-beginAppearanceTransition:animated:
 to
the view controller responsible for the view you added. Then you do the animation, if any. And in the animation completion block, send 
-endAppearanceTransition
 to
the view controller that appeared. NOTE: Do not call 
[viewController
viewDidAppear:NO]
 - you should never invoke these methods yourself. – Sam Nov
12 '13 at 10:41
show 4 more
comments
up vote14down
vote
@Sam's comment is correct. You need to call 
beginApperanceTransition:animated:
 and 
endAppearanceTransition
 for 
viewDidAppear
 to
be triggered. The reason why 
UINavigationController
 does
not call 
viewDidAppear
 when
you add a child view controller is because it has overridden its container composition methods to prevent the programmer from adding a child view controller in strange places. In your case, it doesn't want your child view to cover up the navigation bar. The
correct usage of a navigation controller is to have children appear under the navigation bar. Nonetheless, you can still force upon this non-standard UI by manually telling the child when it is appearing and when it has finished appearing.


Add a child to UINavigationController

MyChildViewController* child = [[MyChildViewController alloc] init]l
[self.navigationController addChildViewController:child];
child.view.frame = self.navigationController.bounds;
[self.navigationController.view addSubjvew: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];
}
];


Remove a child from 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];
}
];


shareimprove
this answer
edited Jul
26 at 14:14





kernix
8861831

answered Mar 25 '14 at 21:19





Pwner
1,19211643

 
1 
I think child be calling 
didMoveToParentViewController:
 when
its being removed.. Something like,
[child
didMoveToParentViewController:nil]
 – Mohammad
Abdurraafay May
11 '14 at 8:37
 
It helped me ... thank you. Gave upvote Pwner. – Meenu Jul
29 '14 at 12:43
 
very helpful, thanks! – kernix Jul
26 at 12:48
add
a comment
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: