2016-06-05 4 views
0

몇 가지 편리한 드로잉 메서드를 구현하는 사용자 지정 UIView가있어서 특정 모서리의 모서리 반경을 설정하고 테두리를 그리고 배경색 대신 그라디언트를 사용할 수 있습니다. 나는 drawRect(rect:CGRect)을 오버라이드하여 이것을 달성했다. 그러나 CGContextClip을 사용하여 CGPathRef에 그리기 클립을 만들지 만 배경색은 항상 뷰의 경계를 채우기 위해 그려집니다. 이는 drawRect가 호출되기 전에 뷰의 레이어가 그려지기 때문입니다.CALayer가 배경색을 그리는 것을 방지하려면 어떻게해야합니까?

backgroundColor에 대한 setter를 재정의하는 것 외에 drawRect에서 지정한 내용 만 그리는 다른 방법이 있습니까? 나는 CAShapeLayer 또는 어떤 종류의 레이어로 레이어를 가리고 싶지 않습니다. 레이어의 범위 바깥에서 하위 클래스로 그리고 그릴 수 있어야합니다.

+1

색상을 지우고 세터를 무시하도록 'backgroundColor'를 설정하십시오. 그것이 당신이 할 수있는 유일한 방법입니다. 또한 속성'clearsContextBeforeDrawing'과'opaque'를 주목하십시오. – Sulthan

+0

그래, 현재 backgroundColor 재정의 메서드를 사용하고 있지만 더 좋은 방법이 있는지 궁금해했습니다. 있는 것 같지 않습니다. – GoldenJoe

답변

0

view.layer.masksToBounds = true을 설정하면 행운을 찾을 수 있습니다.

0

drawRect : 메서드의 끝 부분에 [super drawRect : frame]을 넣을 수 있습니까?

2

CALayer 서브 클래스를 통해 백그라운드가 그려지는 방식을 변경할 수 있습니다.

CALayer 서브 클래스에서 super.draw를 호출하면 배경이 그려집니다. 이를 생략하면 배경이 그려지지 않습니다. 당신은 분명 이외의 다른 뷰의 배경색을 변경하는 경우

class CustomDrawingLayer: CALayer { 
    override func draw(in ctx: CGContext) { 
    // super.draw(in: ctx) don't call to prevent default drawing behaviour 

    // custom drawing code 
    } 
} 

, 기가 CALayer.isOpaque가 true로 설정됩니다 (당신은 또한 UIView.draw를 오버라이드 (override) 할 필요가 또는 메서드가 호출되지 않습니다) 그 불투명 한 색이 그 배경이 검은 색 고체 될 것입니다 그려되지 않을 경우 어떤 사용자가 설정하는 것 문제에 대한 변수

override var isOpaque: Bool { 
    get { 
     return false 
    } 
    set { 
     // you can leave this empty... 
    } 
} 

더 쉬운 솔루션을 대체하여이 문제를 방지 할 수 있습니다, 레이어의 알파 채널을 제거 보기의 배경색을 지우고보기에서 원하는대로 배경을 그립니다.

관련 문제