太阳升起并下落的小动画-SWIFT

一个小小的动画,太阳公公上山又下山。先上效果图。

用 lipecap 录的gif效果有点卡顿。好吧,说下如何实现的。

首先在一个大圆内先计算出内切九边形各个顶点的位置,接着连接相应的顶点变成一个九角星太阳的九条光芒,然后在九角星的中心画一个圈形的Layer,这样就大致画好了大阳的形状。

新建一个叫SunView的文件继承自UIView,然后在init方法内添加一个addSunLayer()的方法。并在里面添加以下方内容

class SunView: UIView {

override init(frame: CGRect) {

super.init(frame: frame)

addSunLayer()

}

required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

}

}

在addSunLayer()方法内添加绘制九角星的代码:

let ninePolyganPath:UIBezierPath = UIBezierPath()
//大圆的半径
let radius:CGFloat = self.frame.size.width / 2
//九角星各个顶点的位置
var anglePoints:Dictionary<String,CGPoint> = Dictionary<String,CGPoint>()
//第一个顶点的位置,最右边中间那个点
let firstPoint:CGPoint = CGPoint(x: bounds.width, y: bounds.width / 2)
anglePoints["0"] = firstPoint
ninePolyganPath.moveToPoint(firstPoint)

 for i in 1..<9 {
    //将圆分成9份,每一份的大小为40度
    let angle = Double(i) * 40.0
    //算出相应角度的三角函数值
    let rateSin:CGFloat = sin(CGFloat(angle / 180 * M_PI))
    let rateCos:CGFloat = cos(CGFloat(angle / 180 * M_PI))
    let x:CGFloat = radius * rateCos + radius
    let y:CGFloat = radius * rateSin + radius
    anglePoints[String(i)] = CGPoint(x: x, y: y)
 }
//连接相应的九个点,使之成为九角星
ninePolyganPath.addLineToPoint(anglePoints["4"]!)
ninePolyganPath.addLineToPoint(anglePoints["8"]!)
ninePolyganPath.addLineToPoint(anglePoints["3"]!) ninePolyganPath.addLineToPoint(anglePoints["7"]!) ninePolyganPath.addLineToPoint(anglePoints["2"]!)
ninePolyganPath.addLineToPoint(anglePoints["6"]!)
ninePolyganPath.addLineToPoint(anglePoints["1"]!)
ninePolyganPath.addLineToPoint(anglePoints["5"]!)
ninePolyganPath.closePath()

let ninePolyganLayer:CAShapeLayer = CAShapeLayer()
ninePolyganLayer.fillColor = UIColor.yellowColor().CGColor
ninePolyganLayer.strokeColor = UIColor.yellowColor().CGColor
ninePolyganLayer.lineWidth = 5
ninePolyganLayer.path = ninePolyganPath.CGPath

self.layer.addSublayer(ninePolyganLayer)

在ViewContoller文件内添加以下代码:

let sunView = SunView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))

self.view.addSubview(sunView)

此时九角星就做好了,运行的效果如下:

接着要在九角星的中星心位置添加一个圆,做为太阳中心。添加一个计算属性,一个钜形的内切圆路径。

var sunCirclePath:UIBezierPath {
        return UIBezierPath(ovalInRect: CGRect(x: self.frame.size.width * 0.3 / 2, y: self.frame.size.height * 0.3 / 2, width: self.frame.size.width - self.frame.size.width * 0.3, height: self.frame.size.height - self.frame.size.height * 0.3))
 }

接着在addSunLayer方法内添加以下内容:

let sunLayer:CAShapeLayer = CAShapeLayer()
sunLayer.path = sunCirclePath.CGPath
sunLayer.lineWidth =  5
sunLayer.fillColor = UIColor.yellowColor().CGColor
sunLayer.strokeColor = UIColor.colorWithHexString("#eecc00").CGColor
self.layer.addSublayer(sunLayer)

//让太阳转动起来

let animation:CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation")

animation.fromValue = 0.0

animation.toValue = 2 * M_PI

animation.duration = 5

animation.repeatCount = HUGE

layer.addAnimation(animation, forKey: nil)

并将上面ninePolyganLayer添加到图层的代码做如下修改。

self.layer.insertSublayer(ninePolyganLayer, below: sunLayer)

//self.layer.addSublayer(ninePolyganLayer)

此时运行效果如下:

最后就是让sunView按着指定的路径运行就可以了。回到ViewController文件内,添加以下计算路径属性,画出一条弧形路径,然后让太阳按着这个路径移动。

var sunrisePath:UIBezierPath {
        let path:UIBezierPath = UIBezierPath()
        path.moveToPoint(CGPoint(x: 0, y: 160))
        path.addQuadCurveToPoint(CGPoint(x: self.view.frame.size.width, y: 160), controlPoint: CGPoint(x: self.view.frame.size.width / 2, y: 60))
        //path.closePath() //这个不能用,
        return path
 }

添加以下动画代码

let sunriseAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position")
sunriseAnimation.path = sunrisePath.CGPath
sunriseAnimation.duration = 3sunriseAnimation.calculationMode = kCAAnimationPaced
sunriseAnimation.fillMode = kCAFillModeForwards
sunriseAnimation.repeatCount = HUGE
sunriseAnimation.removedOnCompletion = false
sunView.layer.addAnimation(sunriseAnimation, forKey: nil)

这样就完成了。以上仅供参考,还请大家多提意见。

时间: 2024-10-17 20:01:12

太阳升起并下落的小动画-SWIFT的相关文章

spring动画(swift)

spring动画(swift) by 伍雪颖 loginButton.center.y += 30 loginButton.alpha = 0 UIView.animateWithDuration(1, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: .AllowUserInteraction, animations: { self.loginButton.center.y -= 30 sel

简单小动画+微博简单模拟2

一.ImageView实现旋转小动画 注意:参数为弧度,不要忘记除数加.0 [UIView animateWithDuration:0.3 animations:^{ self.addImageView.transform=CGAffineTransformMakeRotation(45/180.0*M_PI); }]; 二.button响应点击弹出小界面 弹簧效果 [UIView animateWithDuration:<#(NSTimeInterval)#> delay:<#(NST

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件

0122——简单小动画+微博简单模拟2

一.ImageView实现旋转小动画 注意:参数为弧度,不要忘记除数加.0 [UIView animateWithDuration:0.3 animations:^{ self.addImageView.transform=CGAffineTransformMakeRotation(45/180.0*M_PI); }]; 二.button响应点击弹出小界面 弹簧效果 [UIView animateWithDuration:<#(NSTimeInterval)#> delay:<#(NST

iOS 小动画

一.图片旋转 CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ]; rotationAnimation.duration = 1; rotationAnimati

小白书写Jquery小动画踩的坑

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title>动态添加图片</title> 6 <style> 7 *{margin:0;padding:0;} 8 .box { 9 width:660px; 10 height:660px; 11 border:1px solid black; 12 margin:aut

封装出来的小动画,视图正在加载时的动画

// // LoadImageView.h // WisdomShope // // Created by mac on 15/12/26. // Copyright (c) 2015年 ZY. All rights reserved. // #import <UIKit/UIKit.h> @interface LoadImageView : UIImageView //开始动画 - (void)startImageAnimation:(NSString *)imgName Count:(in

使用SpannableString实现一个load小动画

依然是github开源项目:WaitingDots 这个项目代码不多,实现的非常easy.可是非常有意思由于动画的基本元素不是画出来的,而是使用了spannableString来实现. DotsTextView.java JumpingSpan.java MainActivity.java DotstextView是动画的实现主体. JumpingSpan是基本元素,是动画中的插件 MainActivity中仅仅要在布局中引入DotsTextView就可以. 下面是切割线,show code:

iOS小技巧---swift 判断IOS版本及适配

operatingSystemVersion 为了更复杂的版本比较,operatingSystemVersion能够被直接检查.将它和Swift模式比较和switch语句组合,可以使得代码更简洁. let os = NSProcessInfo().operatingSystemVersion switch  (os.majorVersion, os.minorVersion, os.patchVersion) { case  (8, _, _):      println( "iOS >=