2017-09-14 11 views
0

Swift에서 나는 두 개의 반투명 동그라미를 가지고 있는데 둘 다 CAShapeLayer입니다. 그들이 반투명이기 때문에, 그들 사이의 중복과 같이 표시됩니다 :CAShapeLayer를 CAShapeLayer의 마스크로 사용할 때 얇은 경계

enter image description here

는 대신, 시각적 함께 "병합"로합니다. 내가 시도한 해결책은 원 2를 원 1의 마스크로 사용하여 겹침을 없애는 것입니다.

이 솔루션은 일반적으로 노력하고 있습니다,하지만 난 원이 외부에 얇은 라인을 얻을 :

enter image description here

내 질문 : 나는 오른쪽 원에 얇은, 외부 회선 제거 할 수 방법 ? 왜 거기에 있니? (Xcode playground can be found here)를 다음과 같이


코드는 다음과 같습니다 모두 CAShapeLayers이 같은 알파 값이있는 경우

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 
    } 
+0

가는 선은 거의 확실하게 앤티 엘리 어싱입니다. –

+0

이 경우 앨리어싱을 제어하는 ​​방법은 무엇입니까? – BlackWolf

+0

이 질문에 직접 대답하지 않지만 두 원을 병합하는 대신 두 개의 호를 사용하여 위의 모양을 그릴 수 있습니다. – Sparky

답변

0

, 당신의 CALayer 다음 대신 부모의 알파를 설정 새로운 부모의 내부를 배치 할 수 있습니다.