1

我有一個CAShapeLayer在我的視圖中,它具有CGPath鑄造的Bezierpath實例的路徑。我現在想要動畫結束和兩個控制點,例如該行的結尾正在移動(不停止)。怎麼做?我看着CABasicAninmations,但沒有得到如何訪問終點。與有持續時間的動畫相同。如何讓這發生在無盡的時間。如何動畫結束和控制點SWIFT

+0

http://stackoverflow.com/a/30292047/2303865 –

回答

1

您可以使用CADisplayLink(它就像是NSTimer,除了動畫幀更新的最佳時間外)並更新CAShapeLayerpath


例如:

var displayLink: CADisplayLink? 
var startTime: CFAbsoluteTime? 
let duration = 2.0 

var shapeLayer: CAShapeLayer? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    shapeLayer = CAShapeLayer() 
    shapeLayer?.fillColor = UIColor.clearColor().CGColor 
    shapeLayer?.strokeColor = UIColor.blueColor().CGColor 
    shapeLayer?.lineWidth = 10 
    shapeLayer?.frame = view.bounds 
    view.layer.addSublayer(shapeLayer!) 

    startTime = CFAbsoluteTimeGetCurrent() 
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:") 
    displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) 
} 

func handleDisplayLink(displayLink: CADisplayLink) { 
    let elapsed = CFAbsoluteTimeGetCurrent() - startTime! 
    let percent = (elapsed % duration)/duration 

    let path = UIBezierPath() 
    let startPoint = CGPoint(x: 0, y: view.bounds.size.height/2.0) 
    let controlPoint = CGPoint(x: view.bounds.size.width/20, y: view.bounds.size.height * CGFloat(0.5 + sin(percent * M_PI * 2.0)/2.0)) 
    let endPoint = CGPoint(x: view.bounds.size.width - 1, y: view.bounds.size.height/2.0) 
    path.moveToPoint(startPoint) 
    path.addQuadCurveToPoint(endPoint, controlPoint: controlPoint) 

    shapeLayer?.path = path.CGPath 
} 

即產率:

enter image description here

3

這裏有一些可能性。

  • 配置預先動畫,即,通過產生一系列附圖,就像一個卡通的細胞,並使用這些圖片的簡單的UIImageView動畫。

  • 使用CAShapeLayer和兩個path值之間的動畫。不幸的是,這並不能讓你完全控制中間幀,但你可以使用關鍵幀動畫來提供中間幀,從而提供額外的控制。

  • 動畫繪製的實際點。這是最難配置的,但它是真正的動畫,它可以讓你完全控制動畫。這就是我在這裏所做的:我通過創建一個自定義動畫屬性來實現它 - 在這種情況下,它是一個表示三角形底點的x位置的屬性。你必須這樣做所有你想要動畫的點。

enter image description here

+0

你能共享的源代碼,你實施的第三個選項,請? – Vitaly

+0

@Vitaly https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/bk2ch04p165customAnimatableProperty3 – matt