Пользовательский переход между 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];

person Dimitrio    schedule 30.11.2014    source источник
comment
Я никогда не делал настраиваемый переход для push, но разве он не должен быть secVC.transitioningDelegate = self;?   -  person mbo42    schedule 30.11.2014
comment
Изменено на: secVC.transitioningDelegate = self; secVC.modalPresentationStyle = UIModalPresentationCustom; [самостоятельный PresentViewController: secVC анимированный: ДА завершение: ноль]; И это работает. Но навигационная панель скрыта   -  person Dimitrio    schedule 30.11.2014
comment
Проверьте мой ответ и дайте мне знать, если он работает   -  person mbo42    schedule 30.11.2014


Ответы (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];
person mbo42    schedule 30.11.2014
comment
Спасибо, я попытался обернуть. Но в этом случае пользовательская анимация не появляется, а на панели навигации нет кнопки «Назад». Я полагаю, что viewController должен быть добавлен в стек как дочерний, а не root - person Dimitrio; 30.11.2014
comment
Я думал, ты хочешь сделать подарок вместо этого? В этом случае кнопка «Назад» не будет автоматически добавлена ​​в панель навигации, поскольку она не добавляется ни в один стек навигационного контроллера. - person mbo42; 30.11.2014
comment
Я хочу также иметь возможность вернуться к корневому контроллеру - person Dimitrio; 30.11.2014
comment
Хорошо, извините за мое непонимание. Итак, когда вы изменили на secVC.transitioningDelegate = self; и назвали [self.navigationController pushViewController:secVC animated:YES];, текущая проблема заключается в том, что панель навигации secVC скрыта? - person mbo42; 30.11.2014
comment
Я использую presetViewController: анимация кажется сделанной правильно, но нет возможности закрыть модальное представление ИЛИ вернуться к корневому представлению. Поскольку pushViewController запускает анимацию навигации по умолчанию - person Dimitrio; 30.11.2014
comment
Таким образом, вы можете добавить UIBarButtonItem в NavigationBar и добавить для него селектор, где вы вызываете rejectViewController. - person mbo42; 30.11.2014
comment
После закрытия анимация исчезает - person Dimitrio; 04.12.2014
comment
Это похоже на проблему в вашем пользовательском классе анимации. Добавляете ли вы представление fromViewController в представление контейнера в текущей анимации? - person mbo42; 04.12.2014
comment
Я использовал форму решения: stackoverflow.com/questions/25588617/ - person Dimitrio; 05.12.2014