Dodaj kontroler widoku potomnego do UINavigationController
Próbuję dodać kontroler widoku potomnego do UIViewController
zawartego w {[3] } o tym kodzie:
- (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;
}];
}
Ale To jest wynik:
Jak widać UINavigatioBar
i UIToolbar
są nadal na górze kontrolera widoku potomnego. Jak Mogę umieścić kontroler widoku podrzędnego na górze? Próbowałem już zamienić kod na:
[self.navigationController addChildViewController:viewController];
[self.navigationController.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self.navigationController];
Ale w ten sposób viewDidAppear:animated
z viewController
nie jest wywoływany, Nie wiem dlaczego.
3 answers
W pierwszym kontrolerze widoku zrób coś takiego:
- (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];
}
Następnie w drugim kontrolerze widoku dodaj getter dla imageview:
-(UIImageView *)imageView
{
if( _imageView == nil )
{
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)];
[self.view addSubview:_imageView];
}
return _imageView;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 00:52:50
@komentarz sama jest poprawny. Musisz wywołać beginApperanceTransition:animated:
i endAppearanceTransition
, Aby viewDidAppear
zostało uruchomione. Powodem, dla którego UINavigationController
nie wywołuje viewDidAppear
podczas dodawania kontrolera widoku potomnego, jest to, że nadpisał on metody kompozycji kontenerów, aby uniemożliwić programiście dodawanie kontrolera widoku potomnego w dziwnych miejscach. W Twoim przypadku nie chce, aby Widok dziecka zasłaniał pasek nawigacji. Poprawne użycie kontrolera nawigacyjnego polega na tym, aby dzieci pojawiały się pod nawigacją bar. Niemniej jednak nadal możesz wymusić ten niestandardowy interfejs użytkownika, ręcznie informując dziecko, kiedy się pojawia i kiedy się kończy.
Dodaj dziecko do 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];
}
];
Usuń dziecko z 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];
}
];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:07
@odpowiedź Pwner wersja Swift:
Dodaj dziecko do UINavigaitonController
let child = MyChildViewController()
self.navigationController?.addChildViewController(child)
guard let navigationController = navigationController else {
return
}
child.view.frame = navigationController.view.bounds
child.beginAppearanceTransition(true, animated: true)
self.navigationController?.view.addSubview(child.view)
self.view.alpha = 0
UIView.animate(withDuration: 0.3, animations: {
child.view.alpha = 1.0
}, completion: { _ in
guard let navigationController = self.navigationController else {
return
}
child.endAppearanceTransition()
child.didMove(toParentViewController: navigationController)
})
Usuń dziecko z UINavigationController
child.willMove(toParentViewController: nil)
child.beginAppearanceTransition(false, animated: true)
UIView.animate(withDuration: 0.3, animations: {
child.view.alpha = 0.0
}, completion: { _ in
guard let navigationController = self.navigationController else {
return
}
child.view.removeFromSuperview()
child.endAppearanceTransition()
child.removeFromParentViewController()
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 10:03:56