El Capitan сломал мою анимацию 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 в самом начале на самом деле не происходит.

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


person Carter    schedule 22.09.2015    source источник
comment
Я испытываю то же самое, но при анимации константы NSLayoutConstraint. Мой временный обходной путь — анимация альфы вместо кадра, чтобы вид не появлялся из ниоткуда, но меня это не устраивает.   -  person floschliep    schedule 13.10.2015


Ответы (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;
person corro    schedule 11.03.2016