我正在尝试构建一个 GestureRecognizer
以将 UIView
从右向左拖动。如果用户将 View 拖到屏幕的一半,View 会自动拖到左下角以丢弃它,但如果用户没有拖到屏幕的一半,它将返回到屏幕的右上角。
这里有点迷路,有教程之类的吗?
谢谢
编辑: 下面是一些代码,它是一个 UIImageView
,位于 UIScrollView
中,我需要拖动整个滚动条或仅拖动其中的图像它:
_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)];
_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]];
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial];
_tutorial.userInteractionEnabled = YES;
UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)];
[_tutorial addGestureRecognizer:recognizer];
[self.window addSubview:_myScroll];
我尝试拖动 UIImageView
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:_myScroll];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];
}
最佳答案
查看here .这是一个 UIGestureRecognizer
教程,它将为您提供处理捏合和平移手势的基础知识。一旦你学会了基础知识,就很容易实现你想要的。您所需要做的就是在平移完成后检查 View 的位置,以将其发送到正确的位置。看看this other tutorial在 UIScrollViews
上,它可能会帮助您找到完成第二部分的方法。
两个教程均来自raywenderlich.com ,可能是我所知道的最有用的 iOS 教程网站。
这是您可以处理的 handlePan:
方法的一些代码:
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:_myScroll];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
recognizer.view.center.y + translation.y);
if (recognizer.state == UIGestureRecognizerStateEnded) {
// Check here for the position of the view when the user stops touching the screen
// Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch
// Use this to animate the position of your view to where you want
[UIView animateWithDuration: aDuration
delay: 0
options: UIViewAnimationOptionCurveEaseOut
animations:^{
CGPoint finalPoint = CGPointMake(finalX, finalY);
recognizer.view.center = finalPoint; }
completion:nil];
}
[recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];
}
我不会在这里给你完美的答案,你必须研究代码以找到一种方法让它按照你想要的方式工作。
这是最后一个提示。您可以使用 slideFactor 制作某种“平滑”的动画。它将帮助您的动画更加“逼真”。处理这段代码,您将其添加到“if”的开头:
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
float slideFactor = 0.1 * slideMult; // Increase for more slide
然后在 UIView animateWithDuration:
中,使用 slideFactor
作为持续时间。
关于ios - UIGestureRecognizer 拖动 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879666/