2017-01-05 6 views
0

私は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()コードを削除します。グラフィックコンテキスト内で描画する場合にのみ意味があります(UIViewdrawメソッド、または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

関連する問題