CAShapeLayer的屬性
path
CAShapeLayer的path屬性是他如此牛逼的一個重要起點(diǎn),也是它和貝塞爾曲線緊密連接一個入口,他決定了我們要在圖層上畫一個什么形狀。fillColor
fillColor即layer的path的內(nèi)部填充顏色。-
fillRule
fillRule屬性用于指定使用哪一種算法去判斷畫布上的某區(qū)域是否屬于該圖形“內(nèi)部” (內(nèi)部區(qū)域?qū)⒈惶畛洌?/p>kCAFillRuleNonZero
字面意思是“非零”。按該規(guī)則,要判斷一個點(diǎn)是否在圖形內(nèi),從該點(diǎn)作任意方向的一條射線,然后檢測射線與圖形路徑的交點(diǎn)情況。從0開始計(jì)數(shù),路徑從左向右穿過射線則計(jì)數(shù)加1,從右向左穿過射線則計(jì)數(shù)減1。得出計(jì)數(shù)結(jié)果后,如果結(jié)果是0,則認(rèn)為點(diǎn)在圖形外部,否則認(rèn)為在內(nèi)部。下圖演示了kCAFillRuleNonZero規(guī)則 :
kCAFillRuleEvenOdd
字面意思是“奇偶”。按該規(guī)則,要判斷一個點(diǎn)是否在圖形內(nèi),從該點(diǎn)作任意方向的一條射線,然后檢測射線與圖形路徑的交點(diǎn)的數(shù)量。如果結(jié)果是奇數(shù)則認(rèn)為點(diǎn)在內(nèi)部,是偶數(shù)則認(rèn)為點(diǎn)在外部。下圖演示了kCAFillRuleEvenOdd 規(guī)則:
strokeColor
描邊顏色-
strokeStart、strokeEnd
兩者的取值都是0~1,決定貝塞爾曲線的描邊百分比,對應(yīng)值的改變支持隱式動畫。UIBezierPath* bezierPath_rect = [UIBezierPath bezierPathWithRect:CGRectMake(30, 50, 100, 100)]; bezierPath_rect.lineWidth = 10; CAShapeLayer* shapeLayer = [CAShapeLayer layer]; shapeLayer.path = bezierPath_rect.CGPath; shapeLayer.fillColor = [UIColor redColor].CGColor; shapeLayer.strokeColor = [UIColor blackColor].CGColor; shapeLayer.lineWidth = 10; shapeLayer.strokeStart = 0; shapeLayer.strokeEnd = 0.9; [self.view.layer addSublayer:shapeLayer];運(yùn)行結(jié)果
lineWidth
描邊的線寬。-
miterLimit
最大斜接長度,只有lineJoin屬性為kCALineJoinMiter時miterLimit才有效,當(dāng)銜接角度太小時,斜接長度就會很大,如果設(shè)置了miterLimit并且當(dāng)斜接長度大于這個值時,便會對應(yīng)裁切掉多余區(qū)域:設(shè)置
miterLimit前
設(shè)置miterLimit后
-
lineCap
線端點(diǎn)類型,也就是對應(yīng)曲線結(jié)束的點(diǎn)的顯示樣式。kCALineCapButt 不繪制端點(diǎn) kCALineCapRound 圓形端點(diǎn) kCALineCapSquare 方形端點(diǎn) -
lineJoin
連接點(diǎn)類型,也就是對應(yīng)曲線節(jié)點(diǎn)的位置的顯示樣式。 lineDashPattern
虛線設(shè)置,為一個數(shù)組,數(shù)組中奇數(shù)位實(shí)線長度,偶數(shù)位帶遍空白長度(注意:這里的奇數(shù),偶數(shù)以數(shù)組的第一個元素索引為1計(jì)算)。lineDashPhase
虛線開始的位置,可以使用此屬性做一個滾動的虛線框。
UIBezierPath* bezierPath_rect = [UIBezierPath bezierPathWithRect:CGRectMake(30, 50, 100, 100)];
CAShapeLayer* shapeLayer = [CAShapeLayer layer];
shapeLayer.path = bezierPath_rect.CGPath;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor blackColor].CGColor;
shapeLayer.lineWidth = 1;
shapeLayer.lineDashPattern = @[@6, @6]; //設(shè)置虛線樣式
[self.view.layer addSublayer:shapeLayer];
// 創(chuàng)建子線程隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 使用之前創(chuàng)建的隊(duì)列來創(chuàng)建定時器,注意定時器的生命周期
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
dispatch_async(dispatch_get_main_queue(), ^{
// 改變虛線起點(diǎn)
CGFloat add = 3;
shapeLayer.lineDashPhase -= add;
});
});
// 開啟定時器
dispatch_resume(self.timer);
運(yùn)行效果:






