Es gibt mehrere Beispiele für die UIPanGestureRecognizer
Klasse. Zum Beispiel habe ich gelesen das , und ich bin nach wie vor nicht in der Lage , es zu benutzen ...
In der Nib-Datei, an der ich arbeite, befindet sich ein UIView
(weißes Rechteck auf dem Bild), das ich mit dieser Klasse ziehen möchte:
und in meine .m Datei habe ich gelegt:
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view
{
NSLog(@"Test to see if this method gets executed");
}
und diese Methode wird nicht ausgeführt, wenn ich die Maus über die UIView
. Ich habe auch versucht zu platzieren:
- (void)pan:(UIPanGestureRecognizer *)gesture
{
NSLog(@"testing");
}
Und diese Methode wird auch nicht ausgeführt. Vielleicht irre ich mich, aber ich denke, diese Methode sollte wie die - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
Methode funktionieren , bei der ich diese Methode nur platzieren muss, und sie wird aufgerufen, wenn es Berührungen gibt.
Was mache ich falsch? Vielleicht muss ich eine Verbindung zu dieser Methode herstellen? Wenn ja, wie kann ich das machen?
quelle
UIPanGestureRecognizer * pan1 = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(moveObject:)]; pan1.minimumNumberOfTouches = 1; [image1 addGestureRecognizer:pan1]; -(void)moveObject:(UIPanGestureRecognizer *)pan; { image1.center = [pan locationInView:image1.superview]; }
quelle
image1
wird möglicherweise ziemlich weit springen, so dass seine Mitte unter Ihrem Finger liegt. Besserimage1.center
durch diepan
Übersetzung des für eine flüssigere und Standard-Erfahrung anpassen .-(IBAction)Method { UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [panRecognizer setMinimumNumberOfTouches:1]; [panRecognizer setMaximumNumberOfTouches:1]; [ViewMain addGestureRecognizer:panRecognizer]; [panRecognizer release]; } - (Void)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:self.view]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; if (recognizer.state == UIGestureRecognizerStateEnded) { CGPoint velocity = [recognizer velocityInView:self.view]; CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); CGFloat slideMult = magnitude / 200; NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); float slideFactor = 0.1 * slideMult; // Increase for more of a slide CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), recognizer.view.center.y + (velocity.y * slideFactor)); finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width); finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height); [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ recognizer.view.center = finalPoint; } completion:nil]; } }
quelle
CGPointMake(0, 0)
du kannst schreibenCGRectZero
.CGPointZero
?if ([recognizer state] == UIGestureRecognizerStateChanged) { CGPoint translation1 = [recognizer translationInView:main_view]; img12.center=CGPointMake(img12.center.x+translation1.x, img12.center.y+ translation1.y); [recognizer setTranslation:CGPointMake(0, 0) inView:main_view]; recognizer.view.center=CGPointMake(recognizer.view.center.x+translation1.x, recognizer.view.center.y+ translation1.y); } -(void)move:(UIPanGestureRecognizer*)recognizer { if ([recognizer state] == UIGestureRecognizerStateChanged) { CGPoint translation = [recognizer translationInView:self.view]; recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; } }
quelle
Swift 2-Version der @ MS AppTech-Antwort
func handlePan(panGest : UIPanGestureRecognizer) { let velocity : CGPoint = panGest.velocityInView(self.view); let magnitude : CGFloat = CGFloat(sqrtf((Float(velocity.x) * Float(velocity.x)) + (Float(velocity.y) * Float(velocity.y)))); let slideMult :CGFloat = magnitude / 200; //NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); let slideFactor : CGFloat = 0.1 * slideMult; // Increase for more of a slide var finalPoint : CGPoint = CGPointMake(panGest.view!.center.x + (velocity.x * slideFactor), panGest.view!.center.y + (velocity.y * slideFactor)); finalPoint.x = min(max(finalPoint.x, 0), self.view.bounds.size.width); finalPoint.y = min(max(finalPoint.y, 0), self.view.bounds.size.height); UIView.animateWithDuration(Double(slideFactor*2), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { panGest.view!.center = finalPoint; }, completion: nil) }
quelle
Ein paar Jahre später warf ich meinen Hut in den Ring.
Muss die Anfangsmitte der Bildansicht speichern:
var panBegin: CGPoint.zero
Aktualisieren Sie dann das neue Zentrum mithilfe einer Transformation:
if recognizer.state == .began { panBegin = imageView!.center } else if recognizer.state == .ended { panBegin = CGPoint.zero } else if recognizer.state == .changed { let translation = recognizer.translation(in: view) let panOffsetTransform = CGAffineTransform( translationX: translation.x, y: translation.y) imageView!.center = panBegin.applying(panOffsetTransform) }
quelle
Die Swift 2 Version:
// start detecting pan gesture let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(TTAltimeterDetailViewController.panGestureDetected(_:))) panGestureRecognizer.minimumNumberOfTouches = 1 self.chartOverlayView.addGestureRecognizer(panGestureRecognizer) func panGestureDetected(panGestureRecognizer: UIPanGestureRecognizer) { print("pan gesture recognized") }
quelle