码迷,mamicode.com
首页 > 移动开发 > 详细

《Motion Design for iOS》(四十五)

时间:2016-08-18 10:10:57      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

我们现在还剩两个动画,但它们比较大,需要一些思考。我们需要将顶部的线顺时针旋转45度(所以右边向下倾斜),然后我们需要底部的线逆时针旋转45度(所以右边向上倾斜)。逆时针旋转意味着我们需要旋转一个负值,所以是-45度。当然了,动画不会接受度数值,它们需要角度值,45度在角度上是π/4。来做一些旋转动画。

// 旋转顶部的线来构成X
POPSpringAnimation *topRotate =
    [self.top.layer pop_animationForKey:@"topRotate"];

if (topRotate) {
    topRotate.toValue = @(-M_PI/4);
} else {
    topRotate =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    topRotate.toValue = @(-M_PI/4);
    topRotate.springBounciness = 11;
    topRotate.springSpeed = 18.0f;
    [self.top.layer pop_addAnimation:topRotate forKey:@"topRotate"];
}

// 旋转底部的线来构成X
POPSpringAnimation *bottomRotate =
    [self.bottom.layer pop_animationForKey:@"bottomRotate"];

if (bottomRotate) {
    bottomRotate.toValue = @(M_PI/4);
} else {
    bottomRotate =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    bottomRotate.toValue = @(M_PI/4);
    bottomRotate.springBounciness = 11;
    bottomRotate.springSpeed = 18.0f;
    [self.bottom.layer pop_addAnimation:bottomRotate forKey:@"bottomRotate"];
}

Pop的旋转动画时在layer上操作的(看到kPOPLayerRotation了没),所以我们将动画添加到支撑这些视图的layer上。

我们向上旋转一根线、向下旋转一根线所以它们应该在中间交叉,对吗?让我们看看我们得到了什么。


技术分享


额,直观地说,这可能并不是你期待的样子。旋转动画让线条变成这样的原因是没跟线条都是围绕着它们layer的中心旋转的。所以这些视图会像跷跷板一样旋转,而不是我们想要的在中间交叉的样子。我们可以改变layer旋转的锚点,但这有点麻烦,因为这样做会重定位layer并且我们需要调整框架,这纯粹是找麻烦。所以,更简单的做法是,我们可以就将顶部线下移一点,然后将底部的线上移一旦,然后重叠它们。

// 重定位顶部的线到按钮的中间
POPSpringAnimation *topPosition =
    [self.top.layer pop_animationForKey:@"topPosition"];

if (topPosition) {
    topPosition.toValue = @(29);
} else {
    topPosition =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerTranslationY];
    topPosition.toValue = @(29);
    topPosition.springBounciness = 0;
    topPosition.springSpeed = 18.0f;
    [self.top.layer pop_addAnimation:topPosition forKey:@"topPosition"];
}

// 重定位底部的线到按钮的中间
POPSpringAnimation *bottomPosition =
    [self.bottom.layer pop_animationForKey:@"bottomPosition"];

if (bottomPosition) {
    bottomPosition.toValue = @(-29);
} else {
    bottomPosition =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerTranslationY];
    bottomPosition.toValue = @(-29);
    bottomPosition.springBounciness = 0;
    bottomPosition.springSpeed = 18.0f;
    [self.bottom.layer pop_addAnimation:bottomPosition forKey:@"bottomPosition"];
}

经过一些测试和试错,我决定将顶部的线下移29像素,底部的线上移29像素,这样会让它们重合的最好。你也可以做一些三角几何计算来得出这个值。我们使用kPOPLayerTranslationY动画来让两根线旋转到按钮中间的X。


技术分享


完成了!很好吧?现在,当你点击按钮,它会将三根线变成两根线,但当用户再次点击时会发生什么呢?这时候,不会发生任何事情,因为我们没有实现任何其他条件分支的逻辑来将X变回三根线。幸运的是,我们可以很简单地复制粘贴动画,但是要将toValue值改为初始值。比如说,我们需要将两根线都旋转回0度,记得要移动29像素,并将它们的颜色改回白色。还有要将中间的线淡入回100%不透明。这样就全部完成了,我们得到了一个漂亮的汉堡按钮。


技术分享


查看完整合集:https://github.com/Cloudox/Motion-Design-for-iOS
版权所有:http://blog.csdn.net/cloudox_

《Motion Design for iOS》(四十五)

标签:

原文地址:http://blog.csdn.net/cloudox_/article/details/52237848

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!