2016-06-11 4 views
0

私はCAShapeLayerをその中心点の周りに回転しようとしています。境界線、フレーム、アンカー、中心点については本当に混乱しています。CAShapeLayer私の仲間を動かす

私はUIView内に円形の形状を作成し、その中心の周りを回転させたいと考えています。私はいくつかのコードしか含んでいません。回転する

func drawCompassRedDot() { 

    let compassBall = CAShapeLayer() 
    let compassBallPath = UIBezierPath() 
    let compassBallRadius :CGFloat = 5 

    let xStart: Float = Float(Float(baseCircleRadius) * cos(270 * Float(M_PI)/180)) + Float(self.frame.width/2) 
    let yStart: Float = Float(Float(baseCircleRadius) * sin(270 * Float(M_PI)/180)) + Float((self.frame.height/2)+0) 
    compassBallPath.addArcWithCenter(CGPoint(x: CGFloat(xStart), y: CGFloat(yStart)), radius: compassBallRadius, startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassBall.path = compassBallPath.CGPath 
    compassBall.fillColor = UIColor.redColor().CGColor; 
    compassBall.strokeColor = UIColor.redColor().CGColor 
    compassBall.lineWidth = 1.0 
    self.compassImage.addSublayer(compassBall) 
} 

機能:

func animate(){ 

    compassImage.transform = CATransform3DMakeRotation(degree2radian(45), 0, 0, 1) 

} 

func degree2radian(a:CGFloat)->CGFloat { 
    let b = CGFloat(M_PI) * a/180 
    return b 
} 

私の問題は何である赤い点を作成するために

func drawCompassImage(){ 

    //Compass Bezel Ring 
    let baseCirclePath = UIBezierPath() 

    baseCirclePath.addArcWithCenter(CGPoint(x: CGFloat(self.frame.width/2), y: CGFloat(self.frame.width/2)), radius: CGFloat(baseCircleRadius), startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassImage.path = baseCirclePath.CGPath 
    compassImage.fillColor = UIColor.clearColor().CGColor; 
    compassImage.strokeColor = UIColor.whiteColor().CGColor 
    compassImage.lineDashPattern = [1.0,2.0] 
    compassImage.lineWidth = 10.0 
    self.layer.addSublayer(compassImage) 

} 

機能:私は回転したいサークルを作成する

機能私はそれが常にオフセット終了しようとします:

enter image description here

2つの円は同じ中心を持つ必要があります。

私にお礼をお寄せください...

+0

あなたはこれらの関数が呼び出される場合についてもう少し文脈を投稿することができ、私と他の人ができるように、もっと助けて? @ duck1970 – Ike10

+0

こんにちは私は、クラス – duck1970

答えて

1

私はそれを取り上げました。正しく境界とアンカーポイントに追加する必要があります。

compassImage.frame = bounds 
compassImage.anchorPoint = CGPoint(x: 0.5, y: 0.5) 

そのためのコードは次のようになります。

func drawCompassImage(){ 

    //Compass Bezel Ring 
    let baseCirclePath = UIBezierPath() 

    baseCirclePath.addArcWithCenter(CGPoint(x: CGFloat(self.frame.width/2), y: CGFloat(self.frame.width/2)), radius: CGFloat(baseCircleRadius), startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassImage.path = baseCirclePath.CGPath 
    compassImage.frame = bounds 
    compassImage.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    compassImage.fillColor = UIColor.clearColor().CGColor; 
    compassImage.strokeColor = UIColor.whiteColor().CGColor 
    compassImage.lineDashPattern = [1.0,2.0] 
    compassImage.lineWidth = 10.0 
    self.layer.addSublayer(compassImage) 

} 
+0

から完全なコードを追加しましたあなたのbaseCirclePath.addArcWithCenter()は、おそらくフレームと境界が同じではないことに注意してください。フレームは、スーパービューの座標系で表現されたビューの矩形です。したがって、ビューを回転させると、これはおそらく予想通りに機能しなくなります。ビューまたはレイヤー内でフレームと位置を計算するときは、必ず境界を使用し、bounds.originは0,0と仮定しないでください。このようにして、あなたの視界の外の世界があなたを狂った形でゆがめても、それは働き続けるでしょう。 – Joride

+0

アップデートに感謝します。あなたはこの行を変更することをお勧めしますか? - baseCirclePath.addArcWithCenter(CGPoint(x:CGFloat(self.frame.width/2)、y:CGFloat(self.frame.width/2))、半径:CGFloat(baseCircleRadius)、startAngle:CGFloat(-M_PI_2)、 endAngle:CGFloat(M_PI_2 * 3)、時計回り:真) compassImage.path = baseCirclePath.CGPath – duck1970

+0

はい。 shapeLayerはそのスーパーレイヤー/ビューに配置されます。したがって、そのレイヤー/ビューの座標系を使用したいとします。逆に、あなたのビューがそのレイヤーを占めていることを知りたければ、そのレイヤーのフレームを要求します。既にチェックアウトしているかどうかは不明ですが、そうでない場合はこちらをご覧ください:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Coordinates/Coordinates.html – Joride

関連する問題