Как сделать анимацию слайда при создании пользовательского представления в Cocoa?

Я разрабатываю приложение, при нажатии на кнопку пользовательский вид должен скользить со стороны. На самом деле просто появляется окно, но я хотел бы иметь что-то вроде навигационного контроллера iOS. Как это можно сделать? Это для Mac OS X.

Ответы

Ответ 1

Вы можете использовать переход с Core Animation. Вам нужно включить поддержку слоя для родительского представления, а затем вы можете сделать

[[parentView animator] replaceSubview:oldView with:newView];

По умолчанию это будет пересекать представления, но если вы хотите изменить его на анимацию слайдов, вы добавите соответствующее CATransition в словарь анимации.

- (CATransition *)slideAnimation
{
    CATransition *transition = [CATransition animation];
    [transition setType:kCATransitionMoveIn];
    [transition setSubtype:kCATransitionFromRight];
    return transition;
}

а затем установить эту анимацию в родительском представлении

...
[parentView setAnimations:[NSDictionary dictionaryWithObject:[self slideAnimation] forKey:@"subviews"];
...

Ответ 2

Вы можете использовать animator. Вот пример:

NSPoint startPoint = NSMakePoint(NSWidth([[self window] frame]), NSHeight([[self window] frame]) - NSHeight([view frame]));
[view setFrameOrigin:startPoint];
NSPoint endPoint = NSMakePoint(0.0f, startPoint.y);
[[view animator] setFrameOrigin:endPoint];

Ответ 3

Ответ очень велик! Если это не сработает, проверьте, что вы вызываете [prentView setWantsLayer: YES] где-то в вашем коде.

Ответ 4

NSView *view = yourview;
view.wantsLayer = YES;

//Установите политику перерисовки слоя. Это лучше было бы сделать в методе инициализации подкласса NSView, а не здесь.

 view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay; 

Затем

 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context)
                    {
                        context.duration = 2.f;
                        view.animator.frame = CGRectOffset(view.frame, 180, 0);
                    }
                    completionHandler:^{
                        view.hidden = YES;


                    }];