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
Antwort
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".
Ä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.
Ok, aber wie erkennt man, ob sich die Berührung auf einem bestimmten Objekt befindet? – Pete
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
ist es möglich, dass Sie ein kleines Code-Snippet teilen? – Pete
Der einfachste Weg wäre Unterklassen UIImageView
.
Für einfache Schleppen einen Blick auf den Code nehmen hier (Code von Benutzer MHC entlehnt):
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.
Sir ich das gleiche Problem haben wie Sie mir bitte helfen, wenn Sie das Ding zu tun. –