簡體   English   中英

使用CAShapeLayer作為CAShapeLayer的蒙版時的細邊框

[英]Thin border when using CAShapeLayer as mask for CAShapeLayer

在Swift中,我有兩個半透明的圓,它們都是CAShapeLayer 由於它們是半透明的,因此它們之間的任何重疊都是可見的,如下所示:

在此處輸入圖片說明

相反,我希望它們在視覺上“合並”在一起。 我嘗試過的解決方案是使用圓2作為圓1的蒙版,因此可以消除重疊。

該解決方案通常是可行的,但是我在圓圈2的外面得到一條細線:

在此處輸入圖片說明

我的問題:如何擺脫右圓上的細外線? 為什么還在那里?


代碼如下( 可在此處找到Xcode游樂場 ):

    private let yPosition: CGFloat = 200
    private let circle1Position: CGFloat = 30
    private let circle2Position: CGFloat = 150
    private let circleDiameter: CGFloat = 200
    private var circleRadius: CGFloat { return self.circleDiameter/2.0 }

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .black

        self.view = view

        let circle1Path = UIBezierPath(
            roundedRect: CGRect(
                x: circle1Position,
                y: yPosition,
                width: circleDiameter,
                height: circleDiameter),
            cornerRadius: self.circleDiameter)

        let circle2Path = UIBezierPath(
            roundedRect: CGRect(
                x: circle2Position,
                y: yPosition,
                width: circleDiameter,
                height: circleDiameter),
            cornerRadius: self.circleDiameter)

        let circle1Layer = CAShapeLayer()
        circle1Layer.path = circle1Path.cgPath
        circle1Layer.fillColor = UIColor.white.withAlphaComponent(0.6).cgColor

        let circle2Layer = CAShapeLayer()
        circle2Layer.path = circle2Path.cgPath
        circle2Layer.fillColor = UIColor.white.withAlphaComponent(0.6).cgColor

        self.view.layer.addSublayer(circle1Layer)
        self.view.layer.addSublayer(circle2Layer)

        //Create a mask from the surrounding rectangle of circle1, and
        //then cut out where it overlaps circle2
        let maskPath = UIBezierPath(rect: CGRect(x: circle1Position, y: yPosition, width: circleDiameter, height: circleDiameter))
        maskPath.append(circle2Path)
        maskPath.usesEvenOddFillRule = true
        maskPath.lineWidth = 0

        let maskLayer = CAShapeLayer()
        maskLayer.path = maskPath.cgPath
        maskLayer.fillColor = UIColor.black.cgColor
        maskLayer.fillRule = kCAFillRuleEvenOdd

        circle1Layer.mask = maskLayer
    }

如果兩個CAShapeLayers具有相同的alpha值,則可以將它們放在新的父CALayer中,然后設置父代的alpha。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM