2012-03-29 22 views
4

ich eine einfache Animation entwickle, wo ein UIImageView bewegt sich entlang einer UIBezierPath, jetzt bin Benutzer interation zu dem sich bewegenden UIImageView zur Verfügung stellen möchten, so dass Benutzer die UIImageView Führung durch die UIImageView berühren und ziehen die UIImageview um den Bildschirm.iPhone - entlang berühren und ziehen Pfad bewegen Objekt

+0

Sir ich das gleiche Problem haben wie Sie mir bitte helfen, wenn Sie das Ding zu tun. –

Antwort

5

Sie möchten also, dass der Benutzer ein Bild in der Mitte einer Keyframe-Animation entlang eines gekrümmten Pfads anfassen und an eine andere Stelle ziehen kann? Was willst du mit der Animation zu diesem Zeitpunkt machen?

Sie haben mehrere Herausforderungen.

Zuerst wird die Berührung des Objekts erkannt, während sich eine Keyframe-Animation "im Flug" befindet.

Um dies zu tun, möchten Sie die Methode hitTest der Präsentationsebene der übergeordneten Ansicht verwenden.

Die Darstellungsschicht einer Ebene repräsentiert den Status der Ebene zu einem bestimmten Zeitpunkt, einschließlich Animationen.

Sobald Sie Berührungen in Ihrer Ansicht erkannt haben, müssen Sie die aktuelle Position des Bildes von der Präsentationsebene abrufen, die Animation stoppen und mit einer touchsmoved/touchstrage-basierten Animation übernehmen.

Ich habe eine Demo-Anwendung geschrieben, die zeigt, wie Berührungen an einem Objekt erkannt werden, das entlang eines Pfads animiert wird. Das wäre ein guter Ausgangspunkt.

einen Blick hier nehmen:

Core Animation demo including detecting touches on a view while an animation is "in flight".

9

Ändern Sie den Rahmen der Position der Bildansicht in touchesMoved:withEvent:.

Edit: Einige Code

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([touch.view isEqual: self.view] || touch.view == nil) { 
     return; 
    } 

    lastLocation = [touch locationInView: self.view]; 
} 

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([touch.view isEqual: self.view]) { 
     return; 
    } 

    CGPoint location = [touch locationInView: self.view]; 

    CGFloat xDisplacement = location.x - lastLocation.x; 
    CGFloat yDisplacement = location.y - lastLocation.y; 

    CGRect frame = touch.view.frame; 
    frame.origin.x += xDisplacement; 
    frame.origin.y += yDisplacement; 
    touch.view.frame = frame; 
    lastLocation=location; 
} 

Sie auch touchesEnded:withEvent: und touchesCanceled:withEvent: implementieren sollten.

+0

Ok, aber wie erkennt man, ob sich die Berührung auf einem bestimmten Objekt befindet? – Pete

+0

Die Objekte in der Menge "touches", die Sie in dieser Methode bekommen, sind UITouches und haben daher die Eigenschaft 'view', die Ansicht, in der die Berührung anfänglich aufgetreten ist. – dasdom

+0

ist es möglich, dass Sie ein kleines Code-Snippet teilen? – Pete

1

Der einfachste Weg wäre Unterklassen UIImageView.

Für einfache Schleppen einen Blick auf den Code nehmen hier (Code von Benutzer MHC entlehnt):

UIView drag (image and text)

Da Sie entlang Bezierpfad ziehen möchten Sie müssen ändern touchesMoved:

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

     UITouch *aTouch = [touches anyObject]; 

     //here you have location of user's finger 
     CGPoint location = [aTouch locationInView:self.superview]; 

     [UIView beginAnimations:@"Dragging A DraggableView" context:nil]; 

     //commented code would simply move the view to that point 
     //self.frame = CGRectMake(location.x-offset.x,location.y-offset.y,self.frame.size.width, self.frame.size.height); 

     //you need some kind of a function 
     CGPoint calculatedPosition = [self calculatePositonForPoint: location]; 

     self.frame = CGRectMake(calculatedPosition.x,calculatedPosition.y,self.frame.size.width, self.frame.size.height); 

     [UIView commitAnimations]; 
    } 

Was genau Sie in -(CGPoint) calculatePositionForPoint:(CGPoint)location tun möchten, liegt an Ihnen. Sie könnten zum Beispiel den Punkt im Bezier-Pfad berechnen, der dem location am nächsten liegt. Für einfachen Test können Sie tun:

-(CGPoint) calculatePositionForPoint:(CGPoint)location { 

    return location; 
} 

Auf dem Weg Sie gonna haben zu entscheiden, was ist, wenn Benutzer Wunder aus zu weit von Ihrem vorberechnet Bezierpfad passiert.