Вращающийся NSView вокруг центра

Я пытаюсь анимировать вращение NSView вокруг его центра, но он продолжает смещаться из стороны в сторону во время вращения. Чем это вызвано?

-(void)startRefreshAnimation {

    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:1.0];
    [[NSAnimationContext currentContext] setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    [NSAnimationContext currentContext].completionHandler = ^{ [self startRefreshAnimation]; };
    [[view animator] setFrameCenterRotation:previousRotation - 90.0];
    previousRotation += -90.0;
    [NSAnimationContext endGrouping];

}

Сдвиг во время вращения:

Сдвиг во время вращения:

2 ответа

Решение

Из документации:

Если приложение изменило свойство anchorPoint слоя, поведение не определено. Отправка этого сообщения в представление, которое не управляет слоем Core Animation, вызывает исключение.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

Является ли ваша точка зрения управления CALayer с немодифицированной узловой точкой?

РЕДАКТИРОВАТЬ

Я установил похожий код на те же результаты. Никакая корректировка начала или точки привязки не может решить эту проблему. Моя теория заключается в том, что этот конкретный метод содержит ошибки (делает для автоматического размещения), или работает так, как мы не ожидаем. Я добился правильного эффекта, используя CABasicAnimation,

/* setup */

....
     _view.layer.anchorPoint = CGPointMake(0.5f, 0.5f);
     _view.layer.position = ...

    [self startRefreshAnimation];
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    [self startRefreshAnimation];
}

-(void)startRefreshAnimation {

    CABasicAnimation *anim2 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    anim2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    anim2.fromValue = [NSNumber numberWithFloat:previousRotation * (M_PI / 180.0f)];
    anim2.toValue = [NSNumber numberWithFloat:(previousRotation + 90.0f) * (M_PI / 180.0f)];
    previousRotation = previousRotation + 90.0f;
    anim2.duration = 1.0f;
    anim2.delegate = self;
    [_view.layer addAnimation:anim forKey:@"transform"];
}

Вот фиктивный проект и ответ, который я нашел. (Для применения какао)

Повернуть NSImageView

проект github (скачать)

Другие вопросы по тегам