Анимированная пользовательская презентация ViewController в OS X Yosemite

Я хочу реализовать новый метод, я много искал в Google и Stackru, но я не нашел пример

- (void)presentViewController:(NSViewController *)viewController animator:(id <NSViewControllerPresentationAnimator>)animator

этот метод доступен в OSX 10.10, и этот метод должен реализовывать протокол NSViewControllerPresentationAnimator у которого есть эти два метода

- (void)animatePresentationOfViewController:(NSViewController *)viewController fromViewController:(NSViewController *)fromViewController 

- (void)animateDismissalOfViewController:(NSViewController *)viewController fromViewController:(NSViewController *)fromViewController 

эти методы позволяют нам делать пользовательскую анимацию между двумя NSViewController. Мне нужны специалисты по реализации, у меня есть этот код

- (IBAction)openTask:(id)sender {

    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    Tasks *task = [storyboard instantiateControllerWithIdentifier:@"tasks"];
    [self presentViewController:task animator:self];

}

- (void)animatePresentationOfViewController:(NSViewController *)viewController
                         fromViewController:(NSViewController *)fromViewController
{


}

- (void)animateDismissalOfViewController:(NSViewController *)viewController
                      fromViewController:(NSViewController *)fromViewController
{


}

Может ли кто-нибудь помочь мне с примером того, как я мог бы реализовать этот переход Большое спасибо.

1 ответ

Решение

Вот простая версия (Swift), которая исчезает в представлении нового viewcontroller. Я уверен, что вы можете перевести это в Objective-C.

Вы действительно захотите использовать Autolayout вместо того, чтобы просто менять фрейм, но это сделало бы пример немного длиннее (не слишком сложно. Просто добавьте ограничения после добавления представления)

Я не уверен, если вам нужно сдерживание viewcontroller также. Тогда должны быть соответствующие вызовы addChildViewController и так далее. Может быть, кто-то может пролить свет на то, когда это может быть необходимо, или если это действительно хорошая практика в любом случае.

class MyTransitionAnimator: NSObject, NSViewControllerPresentationAnimator {

    func animatePresentationOfViewController(viewController: NSViewController, fromViewController: NSViewController) {

        let bottomVC = fromViewController
        let topVC = viewController

        // make sure the view has a CA layer for smooth animation
        topVC.view.wantsLayer = true

        // set redraw policy
        topVC.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay

        // start out invisible
        topVC.view.alphaValue = 0

        // add view of presented viewcontroller
        bottomVC.view.addSubview(topVC.view)

        // adjust size
        topVC.view.frame = bottomVC.view.frame

        // Do some CoreAnimation stuff to present view
        NSAnimationContext.runAnimationGroup({ (context) -> Void in

            // fade duration
            context.duration = 2
            // animate to alpha 1
            topVC.view.animator().alphaValue = 1

        }, completionHandler: nil)

    }

    func animateDismissalOfViewController(viewController: NSViewController, fromViewController: NSViewController) {

        let bottomVC = fromViewController
        let topVC = viewController

        // make sure the view has a CA layer for smooth animation
        topVC.view.wantsLayer = true

        // set redraw policy
        topVC.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay

        // Do some CoreAnimation stuff to present view
        NSAnimationContext.runAnimationGroup({ (context) -> Void in

            // fade duration
            context.duration = 2
            // animate view to alpha 0
            topVC.view.animator().alphaValue = 0

        }, completionHandler: {

            // remove view
            topVC.view.removeFromSuperview()
        })

    }
}

Надеюсь, это поможет вам начать!

Другие вопросы по тегам