用 Swift 制作一个漂亮的汉堡按钮过渡动画

- let shortStroke: CGPath = {
- let path = CGPathCreateMutable()
- CGPathMoveToPoint(path, nil, 2, 2)
- CGPathAddLineToPoint(path, nil, 28, 2)
- return path
- }()

- let outline: CGPath = {
- let path = CGPathCreateMutable()
- CGPathMoveToPoint(path, nil, 10, 27)
- CGPathAddCurveToPoint(path, nil, 12.00, 27.00, 28.02, 27.00, 40, 27)
- CGPathAddCurveToPoint(path, nil, 55.92, 27.00, 50.47, 2.00, 27, 2)
- CGPathAddCurveToPoint(path, nil, 13.16, 2.00, 2.00, 13.16, 2, 27)
- CGPathAddCurveToPoint(path, nil, 2.00, 40.84, 13.16, 52.00, 27, 52)
- CGPathAddCurveToPoint(path, nil, 40.84, 52.00, 52.00, 40.84, 52, 27)
- CGPathAddCurveToPoint(path, nil, 52.00, 13.16, 42.39, 2.00, 27, 2)
- CGPathAddCurveToPoint(path, nil, 13.16, 2.00, 2.00, 13.16, 2, 27)
- return path
- }()
- self.top.path = shortStroke
- self.middle.path = outline
- self.bottom.path = shortStroke
- layer.fillColor = nil
- layer.strokeColor = UIColor.whiteColor().CGColor
- layer.lineWidth = 4
- layer.miterLimit = 4
- layer.lineCap = kCALineCapRound
- layer.masksToBounds = true
- let boundingPath = CGPathCreateCopyByStrokingPath(layer.path, nil, 4, kCGLineCapRound, kCGLineJoinMiter, 4)
- layer.bounds = CGPathGetPathBoundingBox(boundingPath)
- self.top.anchorPoint = CGPointMake(28.0 / 30.0, 0.5)
- self.top.position = CGPointMake(40, 18)
- self.middle.position = CGPointMake(27, 27)
- self.middle.strokeStart = hamburgerStrokeStart
- self.middle.strokeEnd = hamburgerStrokeEnd
- self.bottom.anchorPoint = CGPointMake(28.0 / 30.0, 0.5)
- self.bottom.position = CGPointMake(40, 36)
- var transform = CATransform3DIdentity
- transform = CATransform3DTranslate(transform, -4, 0, 0)
- transform = CATransform3DRotate(transform, -M_PI_4, 0, 0, 1)
- let animation = CABasicAnimation(keyPath: "transform")
- animation.fromValue = NSValue(CATransform3D: CATransform3DIdentity)
- animation.toValue = NSValue(CATransform3D: transform)
- animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.25, -0.8, 0.75, 1.85)
- animation.beginTime = CACurrentMediaTime() + 0.25
- self.top.addAnimation(animation, forKey: "transform")
- self.top.transform = transform
- let menuStrokeStart: CGFloat = 0.325
- let menuStrokeEnd: CGFloat = 0.9
- let hamburgerStrokeStart: CGFloat = 0.028
- let hamburgerStrokeEnd: CGFloat = 0.111
- let strokeStart = CABasicAnimation(keyPath: "strokeStart")
- strokeStart.fromValue = hamburgerStrokeStart
- strokeStart.toValue = menuStrokeStart
- strokeStart.duration = 0.5
- strokeStart.timingFunction = CAMediaTimingFunction(controlPoints: 0.25, -0.4, 0.5, 1)
- self.middle.addAnimation(strokeStart, forKey: "strokeStart")
- self.middle.strokeStart = menuStrokeStart
- let strokeEnd = CABasicAnimation(keyPath: "strokeEnd")
- strokeEnd.fromValue = hamburgerStrokeEnd
- strokeEnd.toValue = menuStrokeEnd
- strokeEnd.duration = 0.6
- strokeEnd.timingFunction = CAMediaTimingFunction(controlPoints: 0.25, -0.4, 0.5, 1)
- self.middle.addAnimation(strokeEnd, forKey: "strokeEnd")
- self.middle.strokeEnd = menuStrokeEnd

用 Swift 制作一个漂亮的汉堡按钮过渡动画的更多相关文章
- Swift 制作一个新闻通知中心插件1
使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
来自:http://blog.csdn.net/dawanganban/article/details/17679069 在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的 ...
- 纯Div+Css制作的漂亮点击按钮和关闭按钮
纯Div+Css制作的漂亮点击按钮和关闭按钮,单击点击按钮也有效果.这些都不是图片.
- 使用 Swift 制作一个新闻通知中心插件(1)
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)
在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...
- Expression Blend4经验分享:制作一个简单的图片按钮样式
这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...
- Swift - 制作一个录音机(声音的录制与播放)
1,技术介绍 (1)AVFoundation.framework框架提供了AVAudioRecorder类.它可以实现录音功能. (2)而使用该框架的AVAudioPlayer类,可以实现声音的播放. ...
- css3制作一个漂亮的按钮
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFMAAAA4CAIAAAAO41POAAAGWklEQVRogeWabWwTdRzH/8EwMb6Q69
- 使用 Swift 制作一个新闻通知中心插件(2)
我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教 ...
随机推荐
- hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛
感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...
- hdu 3341(ac自动机+状态压缩)
题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A.T.C.G ...
- JTA事务管理--配置剖析(二)
Spring引用Tomcat的 JTA事务 Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JD ...
- Android常用控件之FragmentTabHost的使用
最近在学TabHost时发现TabActivity在API level 13以后不用了,所以就去寻找它的替换类,找到FragmentActivity,可以把每个Fragment作为子tab添加到Fra ...
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作 http://blog.csdn.net/jglie/article/details/7394256 十一.上下左右移动光标位 p ...
- 使用buildbot实现持续集成(转载)
转载自:http://www.oschina.net/p/buildbot 使用 Buildot 实现持续集成 使用基于 Python 的工具实现持续集成的理论与实践 牛仔式编码的日子在大多数组织中早 ...
- HDU 2227-Find the nondecreasing subsequences(dp+BIT优化)
题意: 给你一个序列a[],求它的不降子序列的个数 分析: dp[i]表示以i结尾不降子序列的个数,dp[i]=sum(dp[j])+1(j<i&&a[j]<=a[i]); ...
- PHP 获取远程文件的大小的3种方法
1.使用file_get_contents() <?php $file = file_get_contents($url); echo strlen($file); ?> 2. 使用get ...
- 微信web调试工具
做微信公众号开发的时候,最头疼的一件事,莫过于bug调试了. 由于有些功能涉及到权限问题,必须在微信公众号内打开,所以对开发人员来说就是遇到了一场噩梦. 这里有两种方法: 1.工具:mac.使用微信m ...
- 求职基础复习之快速排序c++版
#include<iostream> using namespace std; int partition(int a[],int p,int q){ int x = a[q]; ; fo ...