2016-08-23 16 views
1

別のUIImageviewの現在の回転に応じてアイコンを回転させる必要があります。そのために私は1つのUIImageViewを持っています。その動きは回転ユーザージェスチャーによって制御されます。私はまた、適切に回転する必要があるアイコンを含むUIViewを持っています。このUIViewは常にUIImageviewとまったく同じ位置と回転を持ちます。別のUIImageview回転に応じてUIImageviewを回転させます。

グラフィカルこれは私が何をする必要があるかです:

enter image description here

私はこのコードの動作を管理:

私は次のコードでジェスチャーを管理:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    origin = (touches.first?.locationInView(self.view))! 
    xOffSet = CGVector(dx:(origin.x)-rotateImageView.center.x, dy:(origin.y) - rotateImageView.center.y) 
    startingAngle = atan2(xOffSet.dy,xOffSet.dx) 

    //save the current transform 
    tempTransform = rotateImageView.transform 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touch = touches.first 

    if touch!.view === rotateImageView || touch!.view === viewIcons { 
     let touchPoint = touches.first?.locationInView(self.view) 
     yOffSet = CGVector(dx:touchPoint!.x - rotateImageView.center.x, dy:touchPoint!.y - rotateImageView.center.y) 
     let angle = atan2(yOffSet.dy,yOffSet.dx) 

     let deltaAngle = angle - startingAngle! 

     rotateImageView.transform = CGAffineTransformRotate(tempTransform, deltaAngle) 
     viewIcons.transform = CGAffineTransformRotate(tempTransform, deltaAngle) 

     rotateIconsWithImageView (ivClock , angle: deltaAngle) 
     } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    startingAngle = nil 
} 

//reset in case drag is cancelled 
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { 
    rotateImageView.transform = tempTransform 
    startingAngle = nil 
} 

このコードは、ユーザーが画面の別のセクションでジェスチャーを開始したときに発生する別の問題を防ぎます。私はtouchesMoved上の最後の命令として起動し、私はこの機能を使用するアイコンがあれば回転のためRotation gesture produces undesired rotation

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat) { 
    imageview.transform = CGAffineTransformRotate(tempTransform, -angle) 
} 

これはあなたのように(通常は正常に動作の詳細な情報は、この別のstackoverflowのスレッド上で見ることができます私がタッチエリアを変更せずにジェスチャーを開始すれば、gifを参照してください)。しかし、ユーザーがタッチ領域を変更した場合は、回転が正しくないため、変換に使用されていないので、正確に何をするのかわかりません。あなたのtempTransformを取り除く事前

+0

しかし、これは他の質問とまったく同じ問題です。私が前に言ったように、あなたの全体の「tempTransform」は完全に不要です。それはまた間違っています、そして今、事実はあなたをかむために戻ってきています。 – matt

+0

あなたはこれの完全なコードを私に提供することができますか? –

答えて

0

enter image description here

ありがとう:

このGIFが問題を説明します。それはあなたを混乱させるだけです。外輪に変換このように、それらを混合するナッツですので、アイコンに変換と同じではありません:

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat) { 
    imageview.transform = CGAffineTransformRotate(tempTransform, -angle) 
} 

代わりに、単にアイコンの変換を回転させておきます

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat) { imageview.transform = CGAffineTransformRotate(imageview.transform, -angle) } 
+0

これは私が他の質問であなたに言っていたことでもあります。あなたが聞いていないのに、それは正しかったです。 – matt

+0

マットに感謝しますが、imageview.transformを使用すると、アイコン付きの画像ビューが常に動きながら回転します。 –

+0

あなたは 'angle'に間違った値を指定しているからです。 - 私はあなたのためのコード全体を書くつもりはない。さらに、このような「観覧車」の回転については、すでにStack Overflowについて詳しく説明されています。問題は、回転の変換が何であるか、そしてあなたが関連して回転していることを考えていないことです。 – matt

関連する問題