2017-01-05 1 views
0

bezierpath (삼각형 모양)를 UIView 컨테이너 내부에 추가하려고합니다. 그러나 UIView 컨테이너의 포인트를 올바르게 가져 오는 것 같습니다.bezierpath를 UIView 컨테이너 안에 추가합니다.

enter image description here

이 : enter image description here

내가 같은 출력을 싶습니다 : 나는 (여기서 삼각형의 스트립은 컨테이너보기의 왼쪽에 표시되는 것) 결과이 무엇입니까 당신은 분명히 뷰 컨트롤러의 viewDidLoad에이 코드를하고있는

// adding container to add image 
     self.topContainer.backgroundColor = UIColor(red: 49/255, green: 207/255, blue: 203/255, alpha: 1) 
     //  self.topContainer.backgroundColor = UIColor.white 
     self.topContainer.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(self.topContainer) 


     self.topContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     self.topContainer.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.55).isActive = true 
     self.topContainer.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

     let bezierPath = UIBezierPath()     
     bezierPath.move(to: CGPoint(x: 0, y: self.topContainer.frame.size.height)) 
     bezierPath.addLine(to: CGPoint(x: self.topContainer.frame.size.width, y: 222)) 
     bezierPath.addLine(to: CGPoint(x: self.topContainer.frame.size.width, y: self.topContainer.frame.size.height)) 
     bezierPath.addLine(to: CGPoint(x: 0, y: self.topContainer.frame.size.height)) 

     UIColor.white.setFill() 
     bezierPath.fill() 
     bezierPath.lineWidth = 1 
     bezierPath.close() 

     let shapeLayer = CAShapeLayer() 
     shapeLayer.path = bezierPath.cgPath 
     shapeLayer.lineWidth = 2.0 
     shapeLayer.strokeColor = UIColor.white.cgColor 
     shapeLayer.fillColor = UIColor.white.cgColor 
     self.topContainer.layer.addSublayer(shapeLayer) 
+0

?? 첫 번째 스크린 샷에는 파란색이나 빨간색이 표시되지 않습니다. – matt

+0

setFill은 UIColor.white.setFill()이어야하므로 실제 UIView 컨테이너의 초록색 위에 흰색 삼각형이 있어야합니다. 비록 내가 내 라인 연결이 정확하다고 생각하더라도 그것의 표시 안돼 ?? @matt – Aboogie

+0

"녹색 삼각형 위에 흰색 삼각형이 있어야합니다."그런 다음 푸른 색 위에 빨간색 삼각형을 표시하는 것은 매우 어리 석습니다! – matt

답변

0

: 지금까지 내 코드입니다. 당신은해야합니다

  • UIColor.white.setFill()path.fill() 코드를 제거합니다. 그래픽 컨텍스트 내에서 드로잉 (예 : draw 메서드가 UIView 또는 UIGraphicsBegin/EndImageContext) 인 경우에만 의미가 있습니다. CAShapeLayer을 만들고보기/레이어 계층 구조에 추가하면 OS에서 드로잉/채우기를 처리합니다.

  • 가서 만들고 viewDidLoadCAShapeLayer를 구성하지만, UIBezierPath의 생성과 뷰 컨트롤러의 viewDidLayoutSubviews 방법에 CAShapeLayerpath의 설정을 이동합니다. 보기의 frame은 일반적으로 viewDidLoad 동안 알 수 없으며 (제약 조건 또는 자동 크기 조정 마스크를 통해) 변경 될 수 있습니다. viewDidLayoutSubviews이 호출 될 때 frame이 올바르게 구성됩니다 (기본보기의 frame이 변경되면 다시 호출됩니다).

+0

하지만 한 번 플래그를 사용하도록 경고해야하거나 반복해서 경로를 추가 할 것입니다. 'viewDidLayoutSubviews'는 여러 번 호출 될 수 있기 때문에. – matt

+0

그 이유는'viewhidLoad'에'CAShapeLayer'를 한 번 만들고 레이어의 계층에 한 번 추가하는 것입니다. 그런 다음'viewDidLayoutSubviews'는 단순히 그 모양 레이어의'path'를 새로운'UIBezierPath'로 대체합니다. 그것은 그 문제를 피합니다. 그러나 예, 당신이'viewDidLayoutSubviews'에서 매번 새로운'CAShapeLayer'를 추가하는 것과 같은 일을한다면, 당신은 상처의 세계에 빠질 수 있습니다. – Rob

+0

안녕하세요, @ 로브 당신이 말한대로 정확히했습니다,하지만 지금은 경로 또는 모양이 전혀 생성되지 않는 것 같습니다, 지금도 언급 한 바와 같이, 나는 컨테이너보기 높이와 너비를 볼 수 있습니다. – Aboogie

관련 문제