2014-05-03 30 views
1

我正在嘗試動畫實際上是圖像的氣球。爲此,我創建了CALayer的子類,它在內容中顯示圖像,並最終將此子類的多個對象添加到viewcontroller的視圖中。需要關於多個圖層的動畫位置的幫助

一旦我調用一個函數「反彈」這個子類的每個對象。所有這些圖層(氣球)的位置都是以這樣的方式開始動畫的,即它會在視圖邊界周圍產生反彈效果。它通過調用方法「stopBouncing」來不斷改變層的位置,直到它停止。

現在問題是,如果氣球的數量很高,層中會出現閃爍現象,並且性能也不好。

如果有人能夠幫助我有效地執行此類要求,我將非常感激。

注意:這是iPhone版本。

一片全代碼:

-(void)bounce 
{ 
    self.position=CGPointMake(self.position.x+self.moveOffset.x,self.position.y+self.moveOffset.y); 
    if(self.position.x>self.maxBoundary.x || self.position.x<self.minBoundary.x) 
    { 
     self.moveOffset.x=-self.moveOffset.x; 
    } 

    if(self.position.y>self.maxBoundary.y || self.position.y<self.minBoundary.y) 
    { 
     self.moveOffset.y=-self.moveOffset.y; 
    } 
} 

這裏,moveOffset是x軸和這將通過層中的時間間隔內行進y軸的距離。

+0

使用組動畫。看到這篇文章http://stackoverflow.com/questions/10938223/how-can-i-create-an-cabasicanimation-for-multiple-properties – Mani

+0

感謝您的迴應。據我所知,組動畫是爲了在一個圖層上應用多個動畫。但我的要求是同時動畫多個圖層,圖層數取決於記錄數(意思是它的變量)。動畫的種類是單一的,但它是無限的,它將繼續移動圖層的位置。 – Viren

+0

否否。羣組動畫可以在時間播放多個圖層動畫,也可以串行動畫。它基於動畫開始和結束時間計算。 – Mani

回答

0

在這裏要指定氣球一樣的層,而不是實際的動畫的UIImage。此代碼是有點老了,但在斯威夫特3你想確保這樣的代碼寫的是:

let balloonImage = CALayer() 
balloonImage.contents = UIImage(named: "balloon")!.cgImage 
balloonImage.frame = CGRect(x: -50.0, y: 0.0, width: 50.0, height: 65.0) 
view.layer.insertSublayer(balloonImage, below: username.layer) 

的UIImage的(命名爲:「」)應該無論你的圖像被稱爲,該框架就是你想要的圖層是UIImage的複製品。該視圖然後插入到主視圖中。 let flight允許您爲您創建的圖層執行動畫。你可以有不同的設置動畫,如CABasicAnimation,CASpringAnimation等,但要小心,因爲不同的動畫有不同的設置默認值,因爲你不能在CABasicAnimation中使用提供的值/次數。 keyframeAnimation只是爲你的動畫使用值。你也可以有不同的keypath,如「position.x」或「postion.y」。其他keypath包括:transform.rotation,position.x,position.y。

let flight = CAKeyframeAnimation(keyPath: "position") 
flight.duration = 30.0 
flight.values = [ 
    CGPoint(x: -50.0, y: 0.0), 
    CGPoint(x: view.frame.width + 50, y: 160.0), 
    CGPoint(x: -50.0, y: loginButton.center.y) 


].map({ 
    NSValue(cgPoint: $0) 
}) 
flight.keyTimes = [0.0, 0.5, 1.0] 
balloonImage.add(flight, forKey: nil) 
balloonImage.position = CGPoint(x: -50.0, y: loginButton.center.y)