实现iOS 9 Task Switcher动画[转载]

本文转载自http://tech.glowing.com/cn/
如有侵犯,立马删除
原文链接:实现iOS 9 Task Switcher动画

升级到iOS 9以后,发现新的task switcher的动画蛮有趣的,于是就动手实现了下,最终效果如下~

demo效果图

思路

1 首先我们需要一个横向的scroll view,可以用UICollectionView,也可以自己实现一个。scroll view里每一页都是一张card,一屏5张card:

|                        |
|card card card card card|
|                        |

2 其次,我们需要在scrollViewDidScroll中判断每张card距离中心的距离,根据这个值来调整它的alpha,scale以及x轴的translation。

alpha:右边的card alpha都是1,左边的越靠左alpha越小
scale: 从左往右依次变大
translation:除了中间的card,所有的card都会右偏,而为了让中间card大部分都露出来,右边的card偏移需要比左边大
开工

1. 横向滚动的scroll view

我们可以自己实现一个横向无限滚动的scroll view, 具体可以参考:http://tech.glowing.com/cn/practice-in-uiscrollview/
在scrollViewDidScroll中,我们提供一个delegate方法,告诉使用者每一页距离中心的位置,以便apply各种transform到这个view上,delegate方法如下:

@protocol InfiniteScrollViewDelegate \<NSObject\>
- (void)updateView:(UIView *)view withProgress:(CGFloat)progress scrollDirection:(ScrollDirection)direction;
@end

说明一下progress的含义,如果一屏有5个visible views的话,那么它的值会从-2变化到2:

|                   |
|-2...-1...0...1...2|
|                   |

2. 根据每一页的位置来设置它的transform

首先是alpha,中心右边的card alpha都是1,而左边的会越来越淡,所以我们可以这样写:

if (progress \>= 0)   
view.alpha = 1;
} else 
view.alpha = 1 - fabs(progress) * 0.2;
}

其次是scale,由左往右依次变大:

CGAffineTransform transform = CGAffineTransformIdentity;  
CGFloat scale = 1 + (progress) * 0.03;  
transform = CGAffineTransformScale(transform, scale, scale);  

最后是x轴的translation,除了中间的card,所有的card都会往右偏,而为了让中间card大部分都露出来,右边的card偏移需要比左边大

CGFloat translation = 0;  
if (progress \> 0)   
translation = fabs(progress) * SCREEN_WIDTH / 2.2;
} else 
translation = fabs(progress) * SCREEN_WIDTH / 15;
}
transform = CGAffineTransformTranslate(transform, translation, 0); 

完整的实现:

-(void)updateView:(UIView *)view withProgress:(CGFloat)progress scrollDirection:(ScrollDirection)direction
{
    // adjust z-index of each views
    NSMutableArray *views = [[self.scrollView allViews] mutableCopy];
    [views sortUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) 
    {
        return view1.tag > view2.tag;
    }];
    for (UIView *view in views) 
    {
        [view.superview bringSubviewToFront:view];
    }

// alpha
if (progress >= 0) 
{
    view.alpha = 1;
} 
else 
{
    view.alpha = 1 - fabs(progress) * 0.2;
}

CGAffineTransform transform = CGAffineTransformIdentity;    
// scale
CGFloat scale = 1 + (progress) * 0.03;
transform = CGAffineTransformScale(transform, scale, scale);
// translation
CGFloat translation = 0;
if (progress > 0) 
{
    translation = fabs(progress) * SCREEN_WIDTH / 2.2;
} 
else
{
    translation = fabs(progress) * SCREEN_WIDTH / 15;
}
transform = CGAffineTransformTranslate(transform, translation, 0);
view.transform = transform;
}

最后是完整的demo代码:https://github.com/Glow-Inc/TaskSwitcherDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,727评论 2 45
  • 转眼就快过年了。 之前讲过这一年可以被称为碎片之年,订阅的许多公众号上都陆续推文讲一些过年回家的幽微感情。讲两句“...
    秋库里阅读 2,701评论 0 0
  • 谢轩闻到了玫瑰的花香,也听到了欧阳元渡的声音,她专注在手中的《天性呼唤》里 欧阳元渡心中已经有怒火在燃烧,谢轩对他...
    范伊莎瑞阅读 3,150评论 0 0
  • 背景: 富豪:陆嘉城 72岁 曾是40年前一线演员 后成立了自己的影视公司CME 亿万富翁 离异四次 第五次婚姻是...
    赵公子039阅读 3,173评论 4 1
  • 喝火令·落花 向晚飞南浦,黄昏醉北陂。 五更敲碎水中湄。 零落但逐风去,明岁又花飞。 过客拂衣袂,归人画黛眉。 但...
    野渡ing阅读 2,463评论 6 3