Эль Капитан сломал мою анимацию 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;