3 Stimmen

Wie sollte ich mit der Geometrie einer UIView interagieren, ohne Rücksicht auf angewandte Transformationen?

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.

2voto

e.James Punkte 112528

Ich würde das Koordinatensystem der Superview verwenden, da es von der Drehung nicht betroffen ist:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint location = [[touches anyObject] locationInView:self.superview];
    CGPoint relativeTouch = [MathHelper translatePoint:location relativeTo:self.center];
    CGPoint zero = CGPointMake(0, 0);
    float angle = [MathHelper getAngleForPoint:zero andPoint:relativeTouch];
    self.transform = CGAffineTransformMakeRotation(offsetAngle-angle);
}

0voto

willc2 Punkte 37581

Speichern Sie einfach die ursprüngliche Transformation in einem Ivar und lassen Sie es gut sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X