Pytanie Brak animacji, gdy modalPresentationStyle jest ustawione na UIModalPresentationCurrentContext


Kiedy przedstawiam moje UIViewController z modalPresentationStyle rodzica UINavigationController Ustawić UIModalPresentationCurrentContext, UIViewController nie ślizga się. Nie użyto przejścia.

Oto mój kod:

UIViewController *viewController = [[UIViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

Kiedy nie ustawiam modalPresenttionStyle, wszystko dziala. Ale potrzebuję tego stylu, ponieważ chcę UIViewController przedstawia się jako nakładkę.

BTW: Kiedy ViewController jest zwolniony, animacja działa dobrze.


12
2018-02-17 15:14


pochodzenie


Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? - Alf
Mam ten sam problem. Czy kiedykolwiek znalazłeś rozwiązanie? - Matt Baker


Odpowiedzi:


Według UIViewController.h definicja nagłówka: -

/ *   Określa styl przejścia, który będzie używany dla tego kontrolera widoku, gdy jest on prezentowany modalnie. Zestaw   ta właściwość kontrolera widoku, który ma być prezentowany, a nie prezenter. Domyślne wartości to    UIModalTransitionStyleCoverVertical. * /

Powinieneś zastosować to na presentingViewController lubię to:-

UIViewController *viewController = [[UIViewController alloc] init];

 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
 navController.navigationBarHidden = YES;

//Here is the change
 navController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

2
2018-04-10 10:19





Jeśli chcesz UIViewController być przedstawionym jako nakładka, która nie jest właściwym podejściem, ponieważ kiedy to robisz: [self presentViewController:navController animated:YES completion:nil]; Robisz prezentację modalną i nie będziesz mieć kontrolera widoku nadrzędnego poniżej bieżącego. Zamiast tego będziesz miał UIWindow, więc prawdopodobnie będzie tam czarny i to nie jest to, czego chcesz.

Aby wykonać to, co chcesz, musisz przedstawić kontroler jako childViewController i dodać jego widok do widoku kontrolera nadrzędnego w następujący sposób:

UIViewController *viewController = [[UIViewController alloc] init];

[self addChildViewController:viewController];
[self viewWillDisappear:animated];
[self.view addSubview:viewController.view];
[self.view bringSubviewToFront:viewController.view];
[viewController didMoveToParentViewController:parentController];
[self viewDidDisappear:animated];

I aby usunąć UIViewController:

[controller.view removeFromSuperview];
[controller willMoveToParentViewController:nil];
[controller.parentViewController viewDidAppear:animated];
[controller removeFromParentViewController];

1
2018-02-18 15:47



To jest źle! Jeśli użyjesz UIModalPresentationCurrentContext podstawowy viewController jest nadal widoczny! Wypróbuj, przedstawiając lekko przezroczysty kontroler viewController! - Alexander
@Alexander Próbowałem, co powiedziałeś i nie zadziałało. czy możesz podać kod? Mówię, że przejrzystość mi się nie wydała - Julian Osorio


Jeśli chcesz dodać nakładkę, pierwszą rzeczą, którą musisz zrobić, to upewnić się, że używasz nowych interfejsów API funkcji ViewController w systemie iOS 7. Oto krótki samouczek Objc.io Wyświetl przejścia kontrolera

Gdy skończysz, powinieneś mieć animatora i kontroler viewcontroller zgodny z protokołem UIViewControllerTransitioningDelegate.

Następnie, gdy chcesz przedstawić kontroler, musisz ustawić styl prezentacji modalnej na UIModalPresentationStyleCustom, a nie na CurrentContext. Naturalnie Twój animator będzie musiał skonfigurować ramkę prezentowanego kontrolera, aby nadal można było zobaczyć zawartość pod nim.

Oto kolejny samouczek, który może pomóc - Niestandardowe prezentacje 

Wreszcie, będziesz musiał obsłużyć scenariusz prezentacji w dowolnej orientacji, jeśli nie zauważysz dziwnego zachowania podczas obracania, ponieważ pojemnik przejścia pozostaje w pionie. Zobacz moją odpowiedź tutaj - przejścia w dowolnej orientacji


1
2017-08-06 20:53





UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

navController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

zainicjuj viewController za pomocą identyfikatora storyboardu, może to pomóc


1
2018-03-24 07:48





Daj mi znać, jeśli to pomoże, bieżący kontroler widoku zostanie odrzucony, aby rozpocząć animację.

UIViewController *viewController = [[UIViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self dismissViewControllerAnimated:YES completion:^{
  [self presentViewController:navController animated:YES completion:nil];
}];

1
2018-05-26 01:36