Istnieje kilka przykładów tej UIPanGestureRecognizer
klasy. Na przykład Znam to i ja nadal nie jestem w stanie go używać ...
W pliku stalówki, nad którym pracuję, mam UIView
(biały prostokąt na obrazie), który chcę przeciągnąć z tą klasą:
aw moim pliku .m umieściłem:
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view
{
NSLog(@"Test to see if this method gets executed");
}
i ta metoda nie jest wykonywana, gdy przeciągam myszą po UIView
. Próbowałem też umieścić:
- (void)pan:(UIPanGestureRecognizer *)gesture
{
NSLog(@"testing");
}
Ta metoda również nie jest wykonywana. Może się mylę, ale myślę, że te metody powinny działać jak - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
metoda, w której muszę po prostu umieścić tę metodę i zostanie wywołana za każdym razem, gdy pojawi się dotknięcie.
Co ja robię źle? Może muszę narysować połączenie z tą metodą? Jeśli tak, jak mogę to zrobić?
źródło
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]; }
źródło
image1
podskoczy, potencjalnie dość daleko, tak że jego środek znajduje się pod twoim palcem. Lepiej dostosowaćimage1.center
przezpan
„s tłumaczenia na doświadczeniu więcej płynów i standardowym.-(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]; } }
źródło
CGPointMake(0, 0)
możesz pisaćCGRectZero
.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]; } }
źródło
swift 2 wersja odpowiedzi @MS AppTech
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) }
źródło
Rzucam swój kapelusz na ring kilka lat później.
Będzie musiał zapisać początkowy środek widoku obrazu:
var panBegin: CGPoint.zero
Następnie zaktualizuj nowe centrum za pomocą transformacji:
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) }
źródło
Wersja Swift 2:
// 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") }
źródło