1

Ich muss ein Symbol drehen abhängig von der aktuellen Rotation eines anderen UIImageview machen. Dafür habe ich ein UIImageView, dessen Bewegung durch eine Rotation der Benutzergeste gesteuert wird. Ich habe auch eine UIView, die Symbole enthält, die ich richtig drehen muss. Diese UIView hat immer die exakt gleiche Position und Rotation wie die UIImageview.Macht eine UIImageview drehen abhängig von einer anderen UIImageview Rotation

Grafisch ist es das, was ich tun muss:

enter image description here

Ich schaffe es, die Bewegung mit diesem Code:

ich die Geste mit dem folgenden Code verwaltet:

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 
} 

Dieser Code verhindert ein anderes Problem, das auftritt, wenn der Benutzer die Geste in einem anderen Abschnitt des Bildschirms startet. Detaillierte Informationen finden Sie auf dieser eine andere Stackoverflow Thread zu sehen: Rotation gesture produces undesired rotation

Für die Rotation, wenn das Symbol ich diese Funktion verwenden, die ich als letzter Befehl auf touchesMoved aufrufen:

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

Dies funktioniert normalerweise (wie Sie siehe auf dem gif) wenn ich die Geste starte ohne den Touchbereich zu ändern. Aber wenn der Benutzer den Touchbereich ändert, ist die Rotation falsch und da ich nicht mit transform benutzt werde, bin ich mir nicht sicher was genau zu tun ist.

Diese gif illustrieren das Problem:

enter image description here

Vielen Dank im Voraus

+0

Aber das ist genau das gleiche Problem wie die andere Frage! Ich habe dir schon gesagt, dass deine ganze 'TempTransform'-Sache völlig unnötig ist. Es ist auch falsch, und jetzt kommt diese Tatsache zurück, um dich zu beißen. – matt

+0

Kannst du mir den vollständigen Code dafür liefern? –

Antwort

0

Sie sich von Ihrem tempTransform befreien. Es verwirrt dich nur. Die Transformation auf das äußere Rad ist nicht die gleiche wie die Transformation auf das Symbol, so ist es nussig sie so bis mischen:

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

Stattdessen halten nur die der Ikone verwandeln rotierenden:

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

Das habe ich dir auch auf der anderen Frage gesagt, und es war richtig, obwohl du nicht zugehört hast. – matt

+0

Dank matt, aber mit imageview.transform macht die Bildansicht mit dem Symbol ständig mit der Bewegung drehen. –

+0

Weil Sie den falschen Wert für 'angle' liefern. - Ich werde nicht den ganzen Code für dich schreiben. Außerdem wurde diese Art von "Riesenrad" -Rotation bereits auf Stack Overflow stark diskutiert und erklärt. Das Problem ist, dass Sie nicht darüber nachdenken, was eine Rotationstransformation ist und in was Sie sich drehen. – matt