Эль Капитан сломал мою анимацию NSView

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

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

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

//Create animation grouping
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:animationDuration];
[[NSAnimationContext currentContext] setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[NSAnimationContext currentContext] setCompletionHandler:^{
    /*
    Do cleanup stuff here
    */
}];

//Move the views
onscreenView.frame = ENDING_OFFSCREEN_RECT:
offscreenView.frame = ENDING_ONSCREEN_RECT;

//End Grouping
[NSAnimationContext endGrouping];

Я отладил это в меру своих возможностей, и мне кажется, что установка offscreenViewКадр в самом начале фактически не встречается.

Кто-нибудь знает, что я делаю не так?

1 ответ

У меня была очень похожая проблема - offscreenView иногда начинается с неправильной позиции.
offscreenView.layer кажется запутался.

Я исправил это, добавив следующее в мой код очистки:

onscreenView.layer = nil;

так что в следующий раз offscreenView анимация начнется с чистого слоя.
Или, возможно, в вашем случае сбросьте слой перед началом анимации:

offscreenView.layer = nil;

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

//Create animation grouping
...

НОТА:

В моей анимации я добавляю offscreenView каждый раз в superView:

//Position offscreen view at correct starting point.
offscreenView.frame = STARTING_OFFSCREEN_RECT;

[superView addSubview:offscreenView];

//Create animation grouping
...

И в коде очистки я удаляю onscreenView также:

[onscreenView removeFromSuperview];
onscreenView.layer = nil;
Другие вопросы по тегам