首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使iOS 7应用程序切换程序中使用的滑动来杀死动画?

如何使iOS 7应用程序切换程序中使用的滑动来杀死动画?
EN

Stack Overflow用户
提问于 2014-02-16 17:54:29
回答 1查看 456关注 0票数 1

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

目前,我使用的是一个UIPanGestureRecognizer,它附在我的自定义视图上。在父视图的上100个像素中拖动自定义视图时,我启动一个UIAnimation将自定义视图从父视图中发送出去:

代码语言:javascript
复制
- (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应用程序切换程序好。有更好的方法吗?

编辑:

下面是对我有用的东西:

代码语言:javascript
复制
- (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.");
     }];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-16 18:04:45

这里有几个部分。

  1. 释放点。它可以是“超过线”,什么时候视图将被移除或“下”,当它将返回到起始位置。
  2. 在释放过程中加快速度。如果速度很高,那么“视图确实有足够的能量通过这条线”。

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

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

返回动画是有点棘手。窗户得先向上一点然后再向下一点。这是UIKit动力公司可以派上用场的地方。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21815091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档