Пользовательский переход между UIViewControllers не работает
У меня есть объект, который управляет пользовательским переходом:
@interface NavigationManager : NSObject <UIViewControllerAnimatedTransitioning>
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext;
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext;
@property (nonatomic, assign) NSTimeInterval presentationDuration;
@property (nonatomic, assign) NSTimeInterval dismissalDuration;
@property (nonatomic, assign) BOOL isPresenting;
@end
@interface NavigationManager()
@property (nonatomic, strong) id<UIViewControllerContextTransitioning> transitionContext;
@end
@implementation NavigationManager
@synthesize presentationDuration, dismissalDuration, isPresenting;
-(id)init{
self = [super init];
if(self){
self.presentationDuration = 1.0;
self.dismissalDuration = 0.5;
}
return self;
}
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
return self.isPresenting ? self.presentationDuration : self.dismissalDuration;
}
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
self.transitionContext = transitionContext;
if(self.isPresenting){
[self executePresentation:transitionContext];
}
else{
[self executeDismiss:transitionContext];
}
}
...
@end
И в классе, который должен обрабатывать, осуществлять переходы:
@interface ViewController : UIViewController <UIViewControllerTransitioningDelegate>
@property (nonatomic, strong) NavigationManager navigationManager;
..
@end
@implementation
...
// Здесь я делаю навигацию к новому UIViewController
- (void)navigateToNewScreen
{
DetailedNewsController *secVC = [[DetailedNewsController alloc] init];
secVC.fullDescription = fullDescription;
secVC.headerImage = a.imageView.image;
self.transitioningDelegate = self;
[self.navigationController pushViewController:secVC animated:YES];
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
self.animationController.isPresenting = YES;
return self.animationController;
}
- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
self.animationController.isPresenting = NO;
return self.animationManager;
}
@end
По умолчанию анимация перехода выполняется. Кроме того, панель навигации контроллера не отображается после навигации.
ОБНОВИТЬ:
Проблема в том, как я создаю UINavigationController в AppDelegate:
firstVC = [[ViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController:firstVC];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor blackColor];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
1 ответ
Я сделаю ответ с новой информацией, которую вы предоставили. Причина, по которой я отвечаю, заключается в том, что я просто не хочу давать вам код для вставки копии, а хочу дать краткое объяснение этому. Если я правильно понимаю, теперь вы хотите представить ViewController с пользовательским переходом.
Таким образом, вы получили пользовательский переход, изменив код на следующий:
secVC.transitioningDelegate = self;
secVC.modalPresentationStyle = UIModalPresentationCustom;
[self presentViewController:secVC animated:YES completion:nil];
Так как мы его запустили и запустили, в настоящее время нам не хватает навигационной панели ViewController, которую вы хотите показать. Поскольку вы представляете ViewController, он не будет содержаться в существующем стеке NavigationController, в котором находится представляемый вами ViewController.
Поэтому вам нужно обернуть ваш VC, который вы хотите представить, в UINavigationController.
[self presentViewController:[[UINavigationController alloc] initWithRootViewController:secVC] animated:YES completion:nil];