iOS學習筆記: 使用CAShapeLayer創建帶有空心區域的遮罩層


CAShapeLayer是用來接受矢量Path,直接使用GPU來進行渲染的特殊圖層。看下面效果:

對應代碼:

        let markLayer = CAShapeLayer();
        markLayer.frame = self.view.bounds;// layer的位置
        markLayer.fillColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.3).CGColor;// layer的填充顏色,這里設置了透明度
        markLayer.fillRule = kCAFillRuleEvenOdd; //填充規則,稍后會解釋
        
        let path = CGPathCreateMutable(); 
        CGPathAddRect(path, nil, self.subLayer.bounds);
        CGPathAddEllipseInRect(path, nil, CGRectMake(0, self.view.frame.size.height / 2 - 50, self.view.frame.size.width, 200 ));
        markLayer.path = path; //設置要渲染的Path
        self.view.layer.addSublayer(markLayer);

我們生成了由一個矩形內嵌一個橢圓而形成的Path,然后交由CAShapeLayer渲染。中間橢圓呈現空心的原因是因為我們設置了fillRule為kCAFillRuleEvenOdd. 下面解釋下fillRule的作用於用法。由於Path可以表示很復雜的形狀,CAShapeLayer在做填充時必須要區分哪些是屬於內部填充區域,哪些是外部非填充區域。內部填充區域會以填充色填充。區分的方法如下:

從某一區域內部選一個點,畫一條射線到path的邊界以外,對射線與Path的交點進行統計,然后根據fillMode的設置來確定該區域屬於內部填充區域還是外部非填充區域。

fillMode = kCAFillRuleNonZero

對射線與Path的交點進行計數,當射線穿過Path的線的方向為由左向右則計數+1,由右向左則計數-1,最后計數總和為非零則為Path內部,否則為外部。

fillMode = kCAFillRuleEvenOdd

射線與Path的交點數目為奇數時為Path內部,否則為外部。

回到文章開始的示例,中間的橢圓區域內的店到Path邊界外的射線與Path的交點有兩個(橢圓和矩形的邊),因此橢圓區域為外部非填充區域。而矩形與橢圓之間區域則為內部填充區域。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM