Анимированная пользовательская презентация 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()
})
}
}
Надеюсь, это поможет вам начать!