浅谈swift动画(四)

CAKeyframeAnimation

1.透明度动画

    var loginButton:UIButton?
    override func viewDidLoad() {
        super.viewDidLoad()
        let view:UIView = UIView()
        view.backgroundColor = UIColor.red
        view.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
        self.view.addSubview(view)
        
        
        
        let animation:CAKeyframeAnimation = CAKeyframeAnimation()
        animation.duration = 10.0
        animation.keyPath = "opacity"
        let valuesArray:[NSNumber] = [NSNumber(value: 0.95 as Float),
                                      NSNumber(value: 0.90 as Float),
                                      NSNumber(value: 0.88 as Float),
                                      NSNumber(value: 0.85 as Float),
                                      NSNumber(value: 0.35 as Float),
                                      NSNumber(value: 0.05 as Float),
                                      NSNumber(value: 0.0 as Float)]
        animation.values = valuesArray
        animation.fillMode = kCAFillModeForwards
        animation.isRemovedOnCompletion = false
        view.layer.add(animation, forKey: nil)
        
    }

2.路径动画

        //创建一个可变路径
        let circleKeyframePath = CGMutablePath()
        //创建用于转移坐标的Transform,这样我们不用按照实际显示做坐标计算,以这个坐标做基准点。坐标为下半个弧的中心点
        let circleKeyframeTransform:CGAffineTransform = CGAffineTransform(translationX: self.view.frame.size.width / 2, y: 260)
        //  顺时针为false
          circleKeyframePath.addArc(center: CGPoint(x: 0, y: 0), radius: 100, startAngle: CGFloat.pi , endAngle: 0, clockwise: true, transform: circleKeyframeTransform)
//        circleKeyframePath.move(to: CGPoint(x: 100, y: 0), transform: circleKeyframeTransform)
        circleKeyframePath.addLine(to: CGPoint(x: 100, y: -100), transform: circleKeyframeTransform)
        circleKeyframePath.addLine(to: CGPoint(x: 50, y: -100), transform: circleKeyframeTransform)
        circleKeyframePath.addArc(center: CGPoint(x: 0, y: -100), radius: 50, startAngle: 0 , endAngle: CGFloat.pi, clockwise: true, transform: circleKeyframeTransform)
        circleKeyframePath.addLine(to: CGPoint(x: -100, y: -100), transform: circleKeyframeTransform)
        circleKeyframePath.addLine(to: CGPoint(x: -100, y: 0), transform: circleKeyframeTransform)
        let backgroundLayer:CAShapeLayer = CAShapeLayer()
        backgroundLayer.path = circleKeyframePath
        backgroundLayer.strokeColor = UIColor.blue.cgColor
        backgroundLayer.lineWidth = 3
        backgroundLayer.fillColor = UIColor.clear.cgColor
        //        backgroundLayer.backgroundColor = UIColor.red.cgColor
        self.view.layer.addSublayer(backgroundLayer)
        
        let circleView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        let redCircleLayer:CAShapeLayer = CAShapeLayer()
        let redCirclePath:UIBezierPath = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 20, height: 20))
        redCircleLayer.path = redCirclePath.cgPath
        redCircleLayer.fillColor = UIColor.red.cgColor
        circleView.layer.addSublayer(redCircleLayer)
        self.view.addSubview(circleView)
        //创建关键帧动画对象
        let circleKeyframeAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position")
        circleKeyframeAnimation.path = circleKeyframePath
        circleKeyframeAnimation.duration = 5
        //让 Core Animation 向被驱动的对象施加一个恒定速度,不管路径的各个线段有多长。
        circleKeyframeAnimation.calculationMode = kCAAnimationPaced
        circleKeyframeAnimation.repeatCount = HUGE
        //让它自身也做旋转,不过是圆的看不出效果
        circleKeyframeAnimation.rotationMode = kCAAnimationRotateAutoReverse
        //print(circleView.layer.anchorPoint)
        circleView.layer.add(circleKeyframeAnimation, forKey: nil)
image.png

image.png

动画组

1.旋转缩小平移

        self.view.addSubview(loginButton!)
        let rotate:CABasicAnimation = CABasicAnimation()
        rotate.keyPath = "transform.rotation"
        rotate.toValue = Float.pi
        let scale:CABasicAnimation = CABasicAnimation()
        scale.keyPath = "transform.scale"
        scale.toValue = 0.0
        let move:CABasicAnimation = CABasicAnimation()
        move.keyPath = "transform.translation"
        move.toValue = NSValue(cgPoint:CGPoint(x:217,y:-230))
        let animationGroup:CAAnimationGroup = CAAnimationGroup()
        animationGroup.animations = [rotate,scale,move];
        animationGroup.duration = 2.0;
        animationGroup.fillMode = kCAFillModeForwards;
        animationGroup.isRemovedOnCompletion = false
        loginButton?.layer.add(animationGroup, forKey:nil)

2.按钮点击

image.png
image.png
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let loginButton: CustomButton = CustomButton(frame: CGRect(x: 20, y: 230, width: self.view.frame.width-20*2,height: 50))
        loginButton.setTitle("登陆", for: UIControlState())
        loginButton.addTarget(self, action: #selector(ViewController.loginAction(_:event:)), for: UIControlEvents.touchUpInside)
        self.view.addSubview(loginButton)
    }
    
    func loginAction(_ sender:UIButton,event:UIEvent) {
        let bt:CustomButton = sender as! CustomButton
        bt.startButtonAnimation(sender, event: event)
    }
import UIKit

class CustomButton: UIButton {
    var circleCenterX: CGFloat = 0
    var circleCenterY: CGFloat = 0
    var timer: Timer?
    var viewRadius:CGFloat = 0
    var countNum:Int = 0
    var targetAnimColor: UIColor = .blue
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .red
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func startButtonAnimation(_ senderButton: UIButton, event: UIEvent) {
        isUserInteractionEnabled = false
        //将点击的点为中心点更改为按钮的中心值
//        let touchSet = event.touches(for: senderButton)! as NSSet
//        let touchArray = touchSet.allObjects
//        let touch = touchArray.first as! UITouch
//        let point = touch.location(in: senderButton)
//        circleCenterX = point.x
//        circleCenterY = point.y
        
        circleCenterX = senderButton.frame.width / 2.0
        circleCenterY = senderButton.frame.height / 2.0

        timer = Timer.scheduledTimer(timeInterval: 0.02, target: self, selector: #selector(timeAction), userInfo: nil, repeats: true)
        RunLoop.main.add(timer!, forMode: .commonModes)
        }
    func timeAction() {
        countNum += 1
        let dismissTime = DispatchTime.now() + Double(Int64(0 * NSEC_PER_SEC)) / Double(NSEC_PER_SEC)
        DispatchQueue.main.asyncAfter(deadline: dismissTime) {
            self.viewRadius += 5
            self.setNeedsDisplay()
        }
        if(countNum>50){
            countNum = 0
            viewRadius = 0
            timer?.invalidate()
            DispatchQueue.main.asyncAfter(deadline: dismissTime, execute: {() in
                self.viewRadius = 0
                self.setNeedsDisplay()
            })
            self.isUserInteractionEnabled = true
        }
    }
    override func draw(_ rect: CGRect) {
        let ctx = UIGraphicsGetCurrentContext()!
        let endangle:CGFloat = CGFloat.pi * 2
        ctx.addArc(center:CGPoint(x:circleCenterX,y:circleCenterY),radius:viewRadius,startAngle:0,endAngle:endangle,clockwise:false)
        let stockColor:UIColor = targetAnimColor
        stockColor.setStroke()
        stockColor.setFill()
        ctx.fillPath()
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,118评论 3 23
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,460评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,091评论 5 13
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 3,012评论 0 21
  • 基础 核心动画是 iOS 和 MacOS 上的图形渲染和动画基础结构,用于为应用的视图和其他视觉元素设置动画。 核...
    davon阅读 1,880评论 0 8