UIImageView mit einem Finger rotieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIImageView mit einem Finger rotieren

    Moin Jungs,

    ich habe hier ein Problem und zwar möchte ich eine ImageView rotieren lassen. Die Bewegung mit dem Finger, soll auf dem GESAMTEN Touchscreen funktionieren und nicht nur auf der ImageView! Ich habe es momentan wie folgt gelöst...

    Quellcode

    1. viewDidLoad
    2. UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
    3. [panRecognizer setMaximumNumberOfTouches:1];
    4. [panRecognizer setMinimumNumberOfTouches:1];
    5. [self.classicView addGestureRecognizer:panRecognizer];
    6. [panRecognizer release];


    Quellcode

    1. handlePanFrom:
    2. CGPoint fingerLocation = [recognizer locationInView:self.classicView];
    3. // Rotation around Origin
    4. CGFloat x = fingerLocation.x - 160.0;
    5. CGFloat y = fingerLocation.y - 201.0;
    6. CGFloat angel = atan((y/x));
    7. if (x > 0.0 && y > 0.0) {
    8. // Quadrant IV
    9. angel -= (M_PI/2);
    10. angel *= -1.0;
    11. angel += (1.5*M_PI);
    12. } else if (x < 0.0 && y > 0.0) {
    13. // Quadrant III
    14. angel *= -1.0;
    15. angel += M_PI;
    16. } else if (x < 0.0 && y < 0.0) {
    17. // Quadrant II
    18. angel -= (M_PI/2);
    19. angel *= -1.0;
    20. angel += (M_PI/2);
    21. } else if (x > 0.0 && y < 0.0) {
    22. // Quadrant I
    23. angel *= -1.0;
    24. }
    25. angel *= -1.0;
    26. if (firstAngel == -1.0) {
    27. firstAngel = angel;
    28. } else {
    29. angel -= firstAngel;
    30. NSLog(@"Angel: %f - FirstAngel: %f", RadiansToDegrees(angel), RadiansToDegrees(firstAngel));
    31. CGAffineTransform transform;
    32. if (self.selectedImage) {
    33. angel += self.outsideLastRotation;
    34. angel = [self checkLimitsOfRotation:angel withMaximum:1.83 withMinimum:-1.83];
    35. transform = CGAffineTransformMakeRotation(angel);
    36. self.outsideImage.transform = transform;
    37. CGFloat messpointerCorrectionValue = angel * 0.196977726;
    38. CGAffineTransform transformForMesspointer = CGAffineTransformMakeRotation(messpointerCorrectionValue);
    39. self.messpointer.transform = transformForMesspointer;
    40. if ([recognizer state] == UIGestureRecognizerStateEnded) {
    41. firstAngel = -1;
    42. self.outsideLastRotation = angel;
    43. }
    44. } else {
    45. angel += self.insideLastRotation;
    46. angel = [self checkLimitsOfRotation:angel withMaximum:0 withMinimum:-1.925800];
    47. transform = CGAffineTransformMakeRotation(angel);
    48. self.insideImage.transform = transform;
    49. if ([recognizer state] == UIGestureRecognizerStateEnded) {
    50. firstAngel = -1;
    51. self.insideLastRotation = angel;
    52. }
    53. }
    54. }
    Alles anzeigen


    Hier habe ich das Problem, das wenn ich von Quadrant I auf IV oder andersrum wechsle, das die Rotation nicht mehr stimmt. Kann mir dabei jemand helfen? Ich vermute, das ich irgendwo einen Denkfehler habe, finde ihn aber leider nicht.
  • Du solltest das Rotieren von der Darstellung des Images trennen. Dann kannst Du den View, der die Geste verarbeitet, auf die volle Größe aufziehen. Zufälligerweise brauchte ich auch so einen View von einigen Tagen. Den habe ich als Unterklasse von UIControl realisiert, um da eine Action für UIControlEventValueChanged per Interface Builder draufhängen zu können. Den ImageView legst Du einfach als Subview in das Control.

    Falls Du noch ein älteres Xcode verwendest, musst Du ggf. die ivars für die Properties in den Header einfügen.
    „Meine Komplikation hatte eine Komplikation.“