我想使用一个自定义视图的滑动动画,该视图位于我的UIViewController视图之上。用户应该能够将自定义视图滑动到顶部,以便将其从屏幕上发送出去。就像iOS7应用程序切换器用来杀死应用程序一样:

目前,我使用的是一个UIPanGestureRecognizer,它附在我的自定义视图上。在父视图的上100个像素中拖动自定义视图时,我启动一个UIAnimation将自定义视图从父视图中发送出去:
- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateEnded && _myView.center.y >= 100)
{
[self resetViewPosition];
}
else
{
CGPoint translation = [recognizer translationInView:_myView.superview];
CGPoint center = _myView.center;
center.x += translation.x;
center.y += translation.y;
_myView.center = center;
if (center.y < 100)
{
NSLog(@"swipe up gesture detected ...");
[self hideView];
}
[recognizer setTranslation:CGPointZero inView:_myView.superview];
}
}这种方法正在工作,但不如iOS7应用程序切换程序好。有更好的方法吗?
编辑:
下面是对我有用的东西:
- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer
{
CGPoint velocity = [recognizer velocityInView:recognizer.view];
if (recognizer.state == UIGestureRecognizerStateEnded && _myView.center.y >= 150)
{
[self resetViewPosition];
}
else
{
CGPoint translation = [recognizer translationInView:_myView.superview];
CGPoint center = _myView.center;
center.x += translation.x;
center.y += translation.y;
_myView.center = center;
if (recognizer.state == UIGestureRecognizerStateEnded && center.y < 150)
{
NSLog(@"swipe up gesture detected ...");
// speed
CGFloat xPoints = -170.0f;
CGFloat velocityX = [recognizer velocityInView:self.view].x;
NSTimeInterval duration = xPoints / velocityX;
[self hideViewWithDuration:duration];
}
}
[recognizer setTranslation:CGPointZero inView:_myView.superview];
}
- (void)hideViewWithDuration:(float)duration
{
NSLog(@"Animation duration: %f", duration);
[UIView animateWithDuration:duration
delay:0.0f
options: UIViewAnimationOptionCurveEaseOut
animations:^
{
CGRect frame = _myView.frame;
frame.origin.y = -170;
frame.origin.x = 10;
_myView.frame = frame;
}
completion:^(BOOL finished)
{
[_myView setHidden:YES];
CGRect frame = _myView.frame;
frame.origin.y = self.view.frame.size.height;
frame.origin.x = 10;
_myView.frame = frame;
[_myView setHidden:NO];
NSLog(@"View is hidden.");
_hideInProgress = NO;
}];
}
- (void)resetViewPosition
{
[UIView animateWithDuration:0.5
delay:0
options: UIViewAnimationOptionCurveEaseOut
animations:^
{
CGRect frame = _myView.frame;
frame.origin.y = (self.view.frame.size.height - _myView.frame.size.height) / 2;
frame.origin.x = 10;
_myView.frame = frame;
}
completion:^(BOOL finished)
{
NSLog(@"View is back to its original place.");
}];
}发布于 2014-02-16 18:04:45
这里有几个部分。
因此,如果点是“足够高”或速度是“足够高”,我们将删除视图,否则将返回它。
第三件事是删除/返回动画。它确实需要有惰性才能表现得更正确。你可以做简单的事情。让“移除窗口”动画的持续时间取决于1/速度。所以你走得越快,动画就会越快。
返回动画是有点棘手。窗户得先向上一点然后再向下一点。这是UIKit动力公司可以派上用场的地方。
我为我的项目做了所有的事情,除了“返回动画”,它看起来非常好。
https://stackoverflow.com/questions/21815091
复制相似问题