Как сделать анимацию слайдов при добавлении пользовательского вида в Какао? - PullRequest
16 голосов
/ 02 августа 2011

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

Ответы [ 4 ]

23 голосов
/ 02 августа 2011

Вы можете использовать переход 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"];
...
5 голосов
/ 02 августа 2011

Вы можете использовать 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];
1 голос
/ 31 мая 2017
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;


                    }];
1 голос
/ 07 декабря 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...