ios - 如何制作 iOS 7 应用程序切换器中使用的滑动以终止动画?

标签 ios objective-c user-interface uiview uianimation

我想为位于 UIViewController View 顶部的自定义 View 使用滑动动画。 用户应该能够将自定义 View 向上滑动到顶部以将其发送出屏幕。就像 iOS7 App Switcher 终止应用程序的手势一样:

enter image description here

目前我使用的是附加到我的自定义 View 的 UIPanGestureRecognizer。当自定义 View 被拖动到父 View 的上部 100 像素时,我启动一个 UIAnimation 以将自定义 View 发送到父 View 之外:

- (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. 发布点。它可以是“越过线”,当 View 将被删除时或“低于”,当它返回到起始位置时。
  2. 释放时的速度。如果速度很高,那么“ View 确实有足够的能量越过线”。

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

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

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

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

关于ios - 如何制作 iOS 7 应用程序切换器中使用的滑动以终止动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21815091/

相关文章:

ios - 在 Swift 中用动画改变 UIView 的 super View

javascript - 是否有任何复杂的 UI 小部件可以与 Tapestry 很好地集成?

java - GUI 编程,FlowLayout 阻塞了 JFrame 上的其他东西(?)

ios - 单击按钮获取数组元素

ios - 如何在 Swift 中压缩 PNG 文件?

ios - 使用自定义 initWithCoder 初始化 View

ios - "Core Data could not fulfill a fault"表示未删除的对象

iphone - 在 Objective C 中使用 #define 或 extern NSString *const 哪个更好

java - 如何获取 JCheckBox 的状态,哪些组件位于 VerticalBox 中?

ios - 在 collectionViewCell 中的导出之前设置属性