2017-04-22 14 views
1

특정 조건이 충족 될 경우 각 모서리가 둥글게해야하는 SKShapeNode가 있습니다. 아래의 링크에서 제공된 대답을 읽으면서, 이것은 단순히 둥근 (4x if 문)을 필요로하는 둥근 추가 모서리에 | =를 사용하기 때문에 조용한 것처럼 보였습니다.둥근 특정 모서리 - SKShapeNode

How to write a generic UIRectCorner function?

그러나이 작동하지 않습니다! 나는 아래의 코드를 사용할 때, 오류 메시지가 도착 |

var corners: UIRectCorner = UIRectCorner(rawValue: 0) | UIRectCorner(rawValue: 1) 

또는

" '='Binart 연산자는 두 개의 'UIRectCorner'피연산자에 적용 할 수 없습니다"
var corners: UIRectCorner = UIRectCorner(rawValue: 0) 
corners |= UIRectCorner(rawValue: 1) 
내가 뭔가 잘못하고 있어야합니다

,하지만 나는 무엇을 알아낼 수 없습니까? 어떤 도움이라도 대단히 감사 할 것입니다.

답변

1

나는 내 SpriteKit 게임에서 많이 사용하는 매우 편리한 확장 기능을 작성했습니다. 기존의 SKShapeNode를 가져와 관련 속성을 모두 복사 한 다음 반올림하도록 지정한 모서리를 제거하고 새 속성을 만듭니다. 참고 : 셰이프 노드에 자식이있는 경우 새 노드를 통해 유지되지 않으므로이 노드를 사용하면 안됩니다. 따라서 자식을 추가하기 전에 항상이 메서드를 사용하십시오.

shapeNode.roundCorners(topLeft:true,topRight: true,bottomLeft:false,bottomRight:false,radius:20,parent:self) 


extension SKShapeNode { 
    func roundCorners(topLeft:Bool,topRight:Bool,bottomLeft:Bool,bottomRight:Bool,radius: CGFloat,parent: SKNode){ 
     let newNode = SKShapeNode(rect: self.frame) 
     newNode.fillColor = self.fillColor 
     newNode.lineWidth = self.lineWidth 
     newNode.position = self.position 
     newNode.name = self.name 
     newNode.fillColor = self.fillColor 
     newNode.strokeColor = self.strokeColor 
     newNode.fillTexture = self.fillTexture 
     self.removeFromParent() 
     parent.addChild(newNode) 
     var corners = UIRectCorner() 
     if topLeft { corners = corners.union(.bottomLeft) } 
     if topRight { corners = corners.union(.bottomRight) } 
     if bottomLeft { corners = corners.union(.topLeft) } 
     if bottomRight { corners = corners.union(.topRight) } 
     newNode.path = UIBezierPath(roundedRect: CGRect(x: -(newNode.frame.width/2),y:-(newNode.frame.height/2),width: newNode.frame.width, height: newNode.frame.height),byRoundingCorners: corners, cornerRadii: CGSize(width:radius,height:radius)).cgPath 
    } 
} 
+0

죄송합니다. 이것은 멋지다! 하지만 'if topLeft'라인에서 'container literal에서 예상되는 표현'오류가 발생합니다. 왜 내가이 오류가 나올지 아십니까? – Jarron

+0

죄송합니다. 이전에 줄에 오타가있었습니다. 그것은 UIRectCorner()가 아니라 UIRectCorner ([')로 끝납니다. – TheValyreanGroup

+0

당신의 질문이 도움이되었거나 해결되었다고 생각되면 투표 나 표기를 고려해보십시오. 다행입니다. – TheValyreanGroup

1

일종의 내 문제가 해결되었습니다. | = 및 + =은 작동하지 않지만 = [previousValue, newValue]는 작동하는 것 같습니다. 아래 내 코드. 더 좋은 방법이 있으면 알려주세요.

func roundCorners() { 

    let TR = true 
    let TL = true 
    let BR = false 
    let BL = true 

    var corners: UIRectCorner = [] 

    if TR == true { 
     corners = [corners, .topRight] 
    } 

    if TL == true { 
     corners = [corners, .topLeft] 
    } 

    if BR == true { 
     corners = [corners, .bottomRight] 
    } 

    if BL == true { 
     corners = [corners, .bottomLeft] 
    } 

    let rect = CGRect(x: -50, y: -50, width: 100, height: 100) 
    let cornerSize = CGSize(width: 10, height: 10) 

    let shape = SKShapeNode() 
    shape.fillColor = UIColor.black 
    shape.path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: cornerSize).cgPath 
    addChild(shape) 

}