Ich habe eine Ansicht, die ich möchte, dass der Benutzer um ihre Mitte zu drehen, indem Sie tippen und halten irgendwo und bewegen Sie einfach ihren Finger rund und rund.
Ich habe die ganze Geometrie ausgearbeitet; Was ich tue, ist der anfängliche Berührungswinkel relativ zum Zentrum als offsetAngle zu speichern, dann meine touchesMoved-Methode sieht wie folgt aus:
- (void) touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
self.transform = CGAffineTransformMakeRotation(0);
CGPoint location = [[touches anyObject] locationInView: self];
CGPoint actualCenter = [self convertPoint: self.center fromView: self.superview];
CGPoint relativeTouch = [MathHelper translatePoint:location relativeTo: actualCenter];
CGPoint zero = CGPointMake(0, 0);
float angle = [MathHelper getAngleForPoint:zero andPoint:relativeTouch];
self.transform = CGAffineTransformMakeRotation(offsetAngle-angle);
}
Der hässliche Teil ist die erste Zeile, in der ich die Drehung wiederherstellen muss, um die richtigen Ereignispositionen in der Ansicht zu erhalten. Wenn ich nicht, dass, dann die Standorte springen alle über den Ort, da es keine Kontinuität, da die Ansicht dreht...
Ein weiteres Problem tritt auf, wenn Sie den Rahmen einer Ansicht manipulieren wollen (z. B. nach unten verschieben), wenn auf die Ansicht eine Transformation angewendet wurde:
- (IBAction)toggleSettingsView {
BOOL state = [settingsSwitch isOn];
float height = optionsView.bounds.size.height;
CGRect polygonFrame = polygonView.frame;
[UIView beginAnimations:@"advancedAnimations" context:nil];
[UIView setAnimationDuration:0.3];
if (state) {
optionsView.alpha = 1.0;
polygonFrame.origin.y += height;
} else {
optionsView.alpha = 0.0;
polygonFrame.origin.y -= height;
}
polygonView.frame = polygonFrame;
[UIView commitAnimations];
}
Dies verzerrt die Sicht stark.
Ich muss erwähnen, dass sowohl die CGTransformation als auch die CALayer-Transformation den gleichen Effekt haben.
Das riecht, als würde ich etwas falsch machen, aber ich weiß nicht, was ich tun soll.