CALayer子類一、CAShapeLayer

CAShapeLayer的屬性
  • path
    CAShapeLayerpath屬性是他如此牛逼的一個重要起點(diǎn),也是它和貝塞爾曲線緊密連接一個入口,他決定了我們要在圖層上畫一個什么形狀。

  • fillColor
    fillColorlayerpath的內(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屬性為kCALineJoinMitermiterLimit才有效,當(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)行效果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容