如何进行滑动以杀死iOS 7应用程序切换器中使用的动画?

我想对我的UIViewController视图顶部的自定义视图使用滑动动画。 用户应该能够将自定义视图向上滑动到顶部以将其发送出屏幕。 完全像iOS7 App Switcher手势杀死一个应用程序:

在此处输入图像描述

目前我使用的是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."); }]; } 

这里有几个部分。

  1. 释放点。 它可以是“在线”,当视图被移除或“在”下,它将返回到起始位置。
  2. 发布期间的速度。 如果速度很高,那么“视图确实有足够的能量越过线”。

因此,如果该点“足够高”或速度“足够高”,我们将删除视图,否则将返回视图。

第三件事是删除/返回动画。 它需要具有惯性才能表现得更加物理正确。 你可以做一些简单的事情。 让“删除窗口”动画的持续时间取决于1 /速度。 你走得越快,动画就越快​​。

返回动画有点棘手。 窗口必须稍微向上然后向下。 这是UIKit Dynamics可以派上用场的地方。

我为我的项目做了除“返回动画”之外的所有事情,它看起来非常好。