開始iOS的動效學習,一開始只對普通的CALayer有所瞭解,偶然的機會想到作一些全局的飄灑的效果。當時採用最笨的方法經過不斷的建立CALayer結合UIView來實現動畫,效果其實還行。後來瞭解到CAEmitterLayer這個iOS系統下的粒子系統。git
CAEmitterLayer這個CALayer須要設置的參數特別的多,每一種參數都會產生特定的效果,這裏本身摸索了下,記錄下來,最後作了個飄灑圓形圖片的效果。學習
CAEmitterLayer的建立主要包括兩部分:CAEmitterLayer、CAEmitterCell,而後將其關聯起來就能夠了CAEmitterLayer.emitterCells = @[CAEmitterCell],基本代碼結構以下:動畫
其實這段代碼就是咱們建立上面飄落效果的代碼,看吧,咱們須要作的事情就是爲了達到所想要的效果而不停的調整設置。那麼咱們須要理解的關鍵就在於理解裏面的各個字段,對每一個字段的改變所達到的效果有個瞭解。設計
下面咱們列舉下所設置的參數以及其對應的效果3d
Layer相關:對象
position: 發射位置 blog
CGPointMake(self.view.bounds.size.width, 0) CGPointMake(self.view.bounds.size.width / 2, 0) 圖片
emitterSize:發射源的尺寸大小,其實這個emitterSize結合position構建了發射源的位置及大小的矩形區域rectci
emitterShape:發射源的形狀,這個字段規定了發射源的形狀it
kCAEmitterLayerPoint:點形狀,發射源的形狀就是一個點,位置在上面position設置的位置
kCAEmitterLayerLine:線形狀,發射源的形狀是一條線,位置在rect的橫向的位於垂直方向中間那條
kCAEmitterLayerRectangle:矩形狀,發射源是一個矩形,就是上面生成的那個矩形rect
kCAEmitterLayerCuboid:立體矩形形狀,發射源是一個立體矩形,這裏要生效的話須要設置z方向的數據,若是不設置就同矩形狀
kCAEmitterLayerCircle:圓形形狀,發射源是一個圓形,形狀爲矩形包裹的那個圓,二維的
kCAEmitterLayerSphere:立體圓形,三維的圓形,一樣須要設置z方向數據,不設置則通二維同樣
emitterMode:發射模式,這個字段規定了在特定形狀上發射的具體形式是什麼
kCAEmitterLayerPoints:點模式,發射器是以點的形勢發射粒子。
若是發射形狀爲:kCAEmitterLayerPoint,則發射效果爲在發射點發射粒
若是發射形狀爲:kCAEmitterLayerLine,則發射效果爲在直線兩端都進行粒子的發射
若是發射形狀爲:kCAEmitterLayerRectangle,則發射效果爲矩形的四個角
若是發射形狀爲:kCAEmitterLayerCircle,則發射效果同kCAEmitterLayerPoint同樣
kCAEmitterLayerOutline: 這個模式下整個邊框都是發射點,即邊框進行發射
若是發射形狀爲kCAEmitterLayerPoint:效果就仍是一個點進行發射
若是發射形狀爲kCAEmitterLayerLine:效果就是哪條直線進行拋灑
若是發射形狀爲kCAEmitterLayerRectangle:效果就是沿着那個矩形框的邊框進行發射
若是發射形狀爲kCAEmitterLayerCircle:效果就是沿着那個圓形的邊框進行發射
效果依次以下所示:
kCAEmitterLayerSurface:這個模式下是咱們邊框包含下的區域進行拋灑
若是發射形狀爲kCAEmitterLayerPoint:效果就仍是一個點進行發射
若是發射形狀爲kCAEmitterLayerLine:效果就是哪條直線進行拋灑
若是發射形狀爲kCAEmitterLayerRectangle:效果就是沿着那個矩形框的內部區域中進行發射
若是發射形狀爲kCAEmitterLayerCircle:效果就是沿着那個圓形的邊框包含的區域中進行發射
效果依次以下所示:
kCAEmitterLayerVolume:這個的效果和kCAEmitterLayerSurface很像
上面介紹了Layer方面發射形狀、發射位置、發射模式的探索,從上面可以大體構建本身想要的發射形狀。下面咱們就要探索拋灑的元素了CAEmitterCell相關的屬性來構建咱們想要拋灑的對象。
contents:cell的內容,通常使用圖片,能夠採用已有的或者本身繪製均可。
birthRate:出生率,這個就是表明每秒有多少個對象生成。
lifetime:生存時間,這個表明對象可以存活的時間
lifetimeRange:生存時間浮動,這個表明生存時間會在這個數字內浮動。好比lifetime = 10s, lifetimeRange = 5s那麼實際的每一個cell的lifetime = [5s - 15s]。
velocity:運動速度,這個表明粒子在拋灑中的運動速度
velocityRange:運動速度的浮動數字。同lifetimeRange的做用同樣,保證了每一個粒子可以有個隨機的速度值
yAcceleration:Y方向的加速度,這個能夠模擬地球上的重力加速度,值越大則每一個粒子下落的越快
velocity=40.f; yAcceleration=15.f 全部的對象都勻速運動,並且y方向有個不斷偏移的過程
velocity=40.f; velocityRange=100.f; yAcceleration=80.f 全部對象的速度不恆定了,且沿着y方向的偏移愈加厲害了
emissionLongitude:拋灑的角度,就是指定cell從什麼方向進行拋灑
emissionRange: 拋灑角度的浮動角度,這個角度指定了拋灑出的對象可以在多大角度範圍內擴散。
emissionLongitude=M_PI; emissionRange=M_PI_4
emissionLongitude=0; emissionRange=M_PI_2
scale: 對象的初始縮放大小
scaleRange:對象的縮放擾動範圍
scaleSpeed: 對象縮放的速度
alphaRange:對象的透明度擾動範圍
alphaSpeed:對象的透明度的變更速度
color:對象的顏色,這裏咱們的cell能夠對圖片重新進行顏色的填充,因此若是對於咱們設計的一個單色的圖片來講,這個字段將頗有用
redRange:紅色通道的擾動範圍
greenRange:綠色通道的擾動範圍
blueRange:藍色通道的擾動範圍
redSpeed:紅色顏色的變動速度
greenSpeed:綠色顏色的變動速度
blueSpeed:藍色顏色的變動速度
咱們經過上面的設置,能夠產生隨機的顏色數值,正如咱們實例中所示的那樣。須要注意的是若是咱們設置了redSpeed、greenSpeed、blueSpeed的話,對象的最後顏色可能變爲了白色或者黑色。
redSpeed=.2f; greenSpeed=.2f; blueSpeed=.2f; 能夠看到對象會很快的失去光澤。
固然你能夠對這些Layer進行動畫,譬如position, scale, birthRate 等等。譬如如下代碼就是讓他的position隨着touch移動,以及對scale作了動畫效果。代碼以下:
而他的運行效果以下:
固然還有不少能夠調節出來的效果,你們能夠組合不一樣的參數試試。這裏我只是簡單的組合了下,有個大概的印象。祝愉快!