若是咱們要繪製一個幾何圖形的話,咱們可使用簡單的UIBezierPath來繪製,可是這樣的話就必須在UIView的drawRect方法裏來繪製或者調用,可是drawRect:方法不能手動顯示調用,必須經過調用setNeedsDisplay或者setNeedsDisplayInRect,讓系統自動調該方法,若是咱們須要即時的繪圖的話,這對咱們來講不免是一個約束,可是使用CAShapeLayer和UIBezierPath的話,則可讓咱們放開雙手,隨時隨地的進行繪圖.該博客只是示範CAShapeLayer的簡單使用,下一篇博客我會具體說一下UIBezierPath的使用. Demo效果圖
CAShaperLayer簡介及使用注意
CAShapeLayer是CALayer的子類,可是要比CALayer更加的靈活,也爲咱們提供了更多樣的設置元素.使用CAShapeLayer的話,須要使用一個給定的Path來設置他的繪圖路線,這個path就是由UIBezierPath來提供的.git
CAShapeLayer在初始化時也須要給一個frame值,可是,它自己沒有形狀,它的形狀來源於你給定的一個path,而後它去取CGPath值,它與CALayer有着很大的區別廢話很少說,看代碼,代碼很簡單,我有詳細的註解.看代碼是最好的交流方式.
代碼講解github
首先建立建立CALayer對象而且設置frame,將shapeLayer放在視圖的中心
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.frame = CGRectMake(0, 0, 200, 200);
shapeLayer.position = self.view.center;性能
使用貝塞爾曲線繪製一個圓形的路徑,而且將shapeLayer的路徑設置爲繪製好的貝塞爾曲線(圓形)
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 200, 200)];
path.lineCapStyle = kCGLineCapRound; //貝塞爾線段端點格式 (該demo暫不作詳細介紹 請參考個人其餘博文有詳細介紹)
path.lineJoinStyle = kCGLineJoinRound; //貝塞爾線段鏈接點格式
shapeLayer.path = path.CGPath;動畫
設置填充顏色和背景顏色
shapeLayer.fillColor = [UIColor redColor].CGColor;
shapeLayer.backgroundColor = [UIColor greenColor].CGColor;ui
設置邊框寬度和邊框顏色,這個地方說的是住背景邊框,並非咱們繪製path
shapeLayer.borderWidth = 4;
shapeLayer.borderColor = [UIColor blueColor].CGColor;spa
設置陰影的顏色以及偏移量和透明度,透明度的屬性默認是0.0 因此若是咱們不設置透明度的屬性的話,那麼將看不到陰影
,須要說明的是,咱們添加的這個陰影暫時是看不到效果的,緣由我會在後面講解.
shapeLayer.shadowColor = [UIColor grayColor].CGColor;
shapeLayer.shadowOffset = CGSizeMake(5, 15);
shapeLayer.shadowOpacity = 0.6;code
設置圓角屬性,須要注意的是,cornerRadius設置的是圓角的值,maskToBounds設置的是切除超過主視圖範圍的內容,在UIView裏這一屬性對應的方法是clipsToBounds.在後面我會具體講解這個概念
shapeLayer.cornerRadius = 13;
shapeLayer.masksToBounds = true;
值得一提的是,當咱們設置masksToBounds屬性爲true的時候,圖層屬性的混合體被指定爲在未預合成以前不能直接在屏幕中繪製,因此就須要屏幕外渲染被喚起,這就是咱們日常說的離屏渲染.若是說須要渲染的控件很少的話,那麼對程序的性能不會咋形成太大的影響,可是若是須要渲染的控件不少的話,好比在tableView裏須要渲染不少控件,那麼就會致使界面卡頓的現象十分嚴重.關於離屏渲染這個問題,我會在之後的博客中進行討論.對象
代碼中容易混淆的地方ip
若是咱們設置這個屬性的爲false的話,那麼超出主視圖範圍的屬性也是可見的,效果以下所示:ci
同時咱們能夠看到,因爲設置的path比較寬(shapeLayer.lineWidth = 20),在咱們設置完maskToBouns屬性以後,超出主視圖的邊線也被切除掉了.
以下所示:
通過個人實驗,若是咱們設置路徑寬度爲20的話,那麼當繪製的時候,路徑會向內外各延伸10個單位,而後完成路徑的繪製,好比咱們繪製一個內切於正方形的圓,設置路線寬度爲20,那麼效果以下所示:
4 . 源碼
想看效果的話能夠去gitHub上下載個人工程:https://github.com/TheRuningAnt/TestCAShapeLayer.git
或者自行拷貝代碼,粘貼運行,各位看官請便:
CAShapeLayer *shapeLayer = [CAShapeLayer layer]; //建立CALayer對象 shapeLayer.frame = CGRectMake(0, 0, 200, 200); //設置frame shapeLayer.position = self.view.center; //將shapeLayer放在視圖的中心 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 200, 200)]; //使用貝塞爾曲線繪製一個圓形的路徑 path.lineCapStyle = kCGLineCapRound; //貝塞爾線段端點格式 (該demo暫不作詳細介紹 請參考個人其餘博文有詳細介紹) path.lineJoinStyle = kCGLineJoinRound; //貝塞爾線段鏈接點格式 (該demo暫不作詳細介紹 請參考個人其餘博文有詳細介紹) shapeLayer.path = path.CGPath; //將shapeLayer的路徑設置爲繪製好的貝塞爾曲線(圓形) shapeLayer.fillColor = [UIColor redColor].CGColor; //設置填充顏色 shapeLayer.backgroundColor = [UIColor greenColor].CGColor; //設置背景顏色 shapeLayer.borderWidth = 4; //設置邊框寬度 shapeLayer.borderColor = [UIColor blueColor].CGColor; //設置邊框顏色 shapeLayer.shadowColor = [UIColor grayColor].CGColor; //設置陰影顏色 shapeLayer.shadowOffset = CGSizeMake(5, 15); //設置陰影偏移量 shapeLayer.shadowOpacity = 0.6; //設置陰影的透明度 默認爲透明的 0.0 shapeLayer.cornerRadius = 13; //設置圓角 shapeLayer.masksToBounds = true; //將超出主圖層範圍的內容切掉 在UIView裏這一屬性對應的方法是clipsToBounds shapeLayer.lineWidth = 20; //設置路徑寬度(使用貝塞爾曲線繪製的路徑寬度) shapeLayer.strokeColor = [UIColor blackColor].CGColor; //設置路徑顏色 [self.view.layer addSublayer:shapeLayer]; //將主圖層添加到視圖圖層上去並顯示出來