2015-09-24 4 views
2

У меня есть собственный подкласс NSView, в котором я рисую горизонтальную линию. У моего NSView есть свойство, называемое lineLength, которое определяет длину строки.Анимация строки с использованием CALayer в NSView

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

Ну, это не работает. Моя строка не рисуется, так как я добавил уровень CA, и я не понимаю, что происходит. Ясно, что я что-то пропустил.

Что мне делать, чтобы анимировать мою линию?

class myView: NSView 
{ 
    var lineLength: CGFloat = 10.0 

    override func awakeFromNib() 
    { 
     super.awakeFromNib() 

     self.layer = CALayer() 
     self.wantsLayer = true 
     self.layer?.display() 
    } 

    override func drawRect(dirtyRect: NSRect) 
    { 
     super.drawRect(dirtyRect) 

     // Drawing code here. 
     let path = NSBezierPath() 
     path.moveToPoint(NSMakePoint(0.0, 10.0) 
     path.lineToPoint(NSMakePoint(lineLength, 10.0) 
     NSColor.blackColor().set() 
     path.stroke() 
    } 

    override func mouseDown(theEvent: NSEvent) 
    { 
     let animation:CABasicAnimation = CABasicAnimation() 

     animation.keyPath = "lineLength"; 
     animation.fromValue = 10; 
     animation.toValue = 500; 
     animation.duration = 3; 

     self.layer!.addAnimation(animation, forKey: "basic"); 
    } 
} 

Одна из идей заключалась бы в подклассе CALayer и использовании его для рисования. Но я не думаю, что я должен это сделать. Обычно яблоко - это более простые решения.

ответ

3

Вы можете сделать строку переменной вашей myView - CAShapeLayer. Добавьте его как подуровень слоя вашего представления.

var yourLineLayer = CAShapeLayer() 
// then in your awake.. 
layer.addSublayer(yourLineLayer) 

Ваш код чертежа для линии будет немного отличаться. Вы можете создать путь, как вы делаете, но затем используйте этот путь для настройки слоя формы.

yourLineLayer.path = path.CGPath() 
yourLineLayer.strokeColor = UIColor.blackColor() 
yourLineLayer.fillColor = UIColor.clearColor() 

Вы можете добавить анимацию в этот CAShapeLayer. Также ваша анимация ничего не делает. Вот как это будет выглядеть для анимации линии.

+1

Благодарим вас за ответ. Я использую Mac OS X и NSView. Изменяет ли что-либо (кроме данных UI)? Я читал, что CALayers меньше поддерживаются на платформе MAC. Кроме того, где я должен поместить код чертежа? Это не работает в drawRect. – John