2015-03-21 11 views
1

У меня есть пользовательский NSView, который должен вращаться вокруг центра с помощью CoreAnimation (или любым другим способом, доступным в osx sdk). Я пробовал много решений, но nsview поворачивался вокруг нижней левой точки вместо центра и, кажется, всегда игнорировал опорную точку. что я делаю неправильно?Поворот NSView вокруг центра

override func awakeFromNib() { 
    super.awakeFromNib() 
    spinnerView = NSView(frame: self.bounds) 
    spinnerView.layer = CALayer() 
    spinnerView.wantsLayer = true 
    addSubview(spinnerView) 

    spinnerView.layer!.backgroundColor = NSColor.redColor().CGColor 
    spinnerView.layer!.position = CGPointMake(CGRectGetMidX(spinnerView.frame), CGRectGetMidY(spinnerView.frame)) 
    spinnerView.layer!.anchorPoint = CGPointMake(0.5, 0.5) 
    startAnimation() 
} 

func startAnimation() { 
    let rotation = CABasicAnimation(keyPath: "transform") 
    rotation.duration = 10.0 
    rotation.toValue = 20 * M_PI 
    rotation.repeatCount = Float.infinity 
    rotation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    rotation.valueFunction = CAValueFunction(name: kCAValueFunctionRotateZ) 

    spinnerView.layer!.addAnimation(rotation, forKey: "transform.rotation.z") 
} 
+0

Он работает как вы ожидаете от меня. – Dario

+0

@ Dario вы проверили, используя mac os 10.10 sdk? – gvalmon

+0

Да, яички 10.10 – Dario

ответ

1

Это, похоже, не работает из-за следующий код в AppDelegate, который превращает NSWindow в слой-подложка:

mainWindow.styleMask = mainWindow.styleMask | NSFullSizeContentViewWindowMask 

Добавление следующего кода в ViewController помог:

self.view.wantsLayer = true 
+0

Несомненно. В OS X это требование, прежде чем Core Animation будет работать, поскольку CA работает с уровнями. –

Смежные вопросы