CAShaplayer實現乙個載入動畫

2022-05-31 22:51:16 字數 2310 閱讀 9027

思路:

方法 建立乙個圖層,圖層要求圓形,可傳引數顏色、大小 

方法 給圖層設定位置和整個載入動畫的大小

之後給其新增動畫,並且注意動畫的begintime要有間距

建立layer

func createlayerwith(size:cgsize,color:uicolor) -> calayer{

let layer:cashapelayer = cashapelayer()

let path:uibezierpath = uibezierpath()

//addarcwithcenter,就是根據中心點畫圓

center:cgpoint 中心點

radius:cgfloat 半徑

startangle:cgfloat 開始的弧度

endangle:cgfloat 結束的弧度

clockwise:bool 繪圖方向 true:順時針 false:逆時針

path.addarcwithcenter(cgpointmake(size.width/2, size.height/2), radius: size.width/2, startangle: 0, endangle: cgfloat(2*m_pi), clockwise: false)

layer.linewidth = 2

layer.fillcolor = color.cgcolor

layer.backgroundcolor = nil

layer.path = path.cgpath

return layer

根據傳入引數,角度angle也就是每個圓對於圓心的角度,size就是小圓的半徑,origin載入動畫中心所在的位置,containersize載入動畫的尺寸,和顏色

func createcircle(angle:cgfloat, size:cgfloat,origin:cgpoint,containersize:cgsize,color:uicolor)->calayer{

let radius = containersize.width/2

let circle = createlayerwith(cgsizemake(size, size), color: color)

let frame = cgrectmake(origin.x+radius*(cos(angle)+1)-size/2, origin.y+radius*(sin(angle)+1)-size/2, size, size)

circle.frame = frame

return circle

以下是設定動畫的過程,建立動畫組

let scaleanimation = cakeyframeanimation.init(keypath: "transform.scale")

//該屬性用以制定每個子路徑的時間

scaleanimation.keytimes = [0,0.5,1]

//關鍵幀點

scaleanimation.values = [1,0.4,1]

scaleanimation.duration = 1

let opacityanimation = cakeyframeanimation.init(keypath: "opacity")

opacityanimation.keytimes = [0,0.5,1]

opacityanimation.values = [1,0.3,1]

opacityanimation.duration = 1

let animation = caanimationgroup()

animation.animations = [scaleanimation,opacityanimation]

animation.duration = 1

animation.repeatcount = huge

animation.removedoncompletion = false

for index in 0...7{

let circle = createcircle(cgfloat(m_pi_4*double(index)), size: 10, origin: cgpointmake(50, 50), containersize: cgsizemake(50, 50), color: uicolor.redcolor())

animation.begintime = double(index)*0.125

circle.addanimation(animation, forkey: "animation")

self.view.layer.addsublayer(circle)

效果圖:

實現乙個Semaphore

其實這是我boss的想法,我一開始聽他這麼說也覺得比較差異,ms已經寫好了何必再自己寫乙個.答案有兩個 1ms寫的東西未必就是最好的,如完成埠,heap等.2semaphore是多執行緒程式設計中的核心元素所以有必要提速.我們都知道在多執行緒中ms提供的多個現成阻塞核心物件中critical mon...

乙個Redis Cache實現

應用中需要通過http呼叫遠端的資料,但是這個獲取過程需要執行較長時間,而且這個資料本身的變化也不頻繁,這種情況最適合用乙個cache來優化。前兩年在做短鏈結實現的時候,曾經用最好的語言php做過乙個redis cache實現 乙個簡單的redis應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...

實現乙個call

call是js最好用的函式之一,改變函式上下文是外掛程式編寫最經常使用的特性。var name 小鋼炮 var cat function say name say ketty 小鋼炮 ketty say.call cat,ketty 貓 ketty看下面 function say name var ...