QuartzCore
QuartzCore
说起QuartzCore不知道有多少小伙伴很容易和Quartz2D、CoreGraphics等混淆在一起傻傻分不清楚?所以在下面我们先把这几个很容易混淆或者是分不清楚的框架稍加整理。
1. Quartz2D是CoreGraphics的一部分API的抽象,不是实际存在的.framework
2. CoreGraphics定义了颜色、位置、字体、路径、图片等UIKit的常见属性。是构成UIKit的基石。
3. QuartzCore里面的类以CA开头,就像CG开头的一般都是CoreGraphics框架里面的一样,我们留一个基本的印象,以后遇到可以区分它属于那个框架。
QuartzCore这个框架也许在一些同行的印象中以为就是 Layer + Path 也就是用来 “画画”的,其实这个框架里面的东西当仔细研究的时候还是很庞大的,就像我们以前有说过的 AVFoundation 一样的,这篇文章的主要目就是下面这一段内容,简单的介绍一下QuartzCore里面的东西,然后你知道它里面的东西都是用来干什么的,当你要具体的了解里面的东西的时候你需要看什么文章。
下面的内容就是先告诉你这个类是用来干什么的,然后当你要具体了解里面的东西的时候有一些学习连接给你去了解:
import Foundation import QuartzCore.CoreAnimation import QuartzCore import QuartzCore.CAAnimation /// 庞大的动画架构 import QuartzCore.CABase import QuartzCore.CADisplayLink /// 一个类似于定时器的link import QuartzCore.CAEAGLLayer /// 用来显示任意的OpenGL图形 import QuartzCore.CAEmitterCell /// 粒子动画 https://www.jianshu.com/p/9fa8bc02117c import QuartzCore.CAEmitterLayer /// 粒子动画 Emitter发射器 import QuartzCore.CAGradientLayer /// 渐变使用 import QuartzCore.CALayer import QuartzCore.CAMediaTiming /// 所有的动画框架都遵守这个协议 import QuartzCore.CAMediaTimingFunction import QuartzCore.CAMetalLayer /// https://www.jianshu.com/p/ee163fc050e4 https://developer.apple.com/documentation/quartzcore/cametallayer import QuartzCore.CAReplicatorLayer /// 重复执行某个操作的layer import QuartzCore.CAScrollLayer /// CAScrollLayer提供了和UIScrollView的基本功能。只不过它是layer,只负责显示,不响应用户事件,也不提供滚动条。 import QuartzCore.CAShapeLayer /// 形状Layer import QuartzCore.CATextLayer /// 它以图层的形式包含了UILabel几乎所有的绘制特性,并且额外提供了一些新的特性。 https://www.jianshu.com/p/df115ffc1076 import QuartzCore.CATiledLayer /// CATiledLayer为载入大图造成的性能问题提供了一个解决方案 https://www.jianshu.com/p/ee0628629f92 import QuartzCore.CATransaction /// CATransaction是 Core Animation 中的事务类 https://www.jianshu.com/p/5e02a8a56cc5 import QuartzCore.CATransform3D /// https://www.jianshu.com/p/3dd14cfbdc53 import QuartzCore.CATransformLayer import QuartzCore.CAValueFunction
上面的连接和文字说明就大致说了QuartzCore里面的类都是用来干什么的,然后在下面着了一个我不怎么熟悉的CAEmitterLayer来写一个简单的粒子动画吧。
CAEmitterLayer 粒子动画
拿其中的这个我们写一个简单的粒子动画,在QuartzCore里面别的Layer应该是使用的比较多的,比如像 CAGradientLayer、CAReplicatorLayer、CAShapeLayer这几个我们平常还是在使用的,但这个CAEmitterLayer我还真的见得比较少,然后就看了一下它的一些具体的使用,总结写了一个动画,动画的效果如下图所示:
下面是上面这个效果的代码,里面拥戴的都加了注释:
import Foundation
import UIKit class PPEmitterButton: UIControl { let emitterName = "emitterButton" /// 给外部读取按钮的状态
var buttonSelected: Bool{
set(newValue) {
self.chose = newValue
}
get{
return self.chose
}
} var normalImage :UIImage?
var selectedImage:UIImage?
var effectlImage :UIImage?
/// 记录按钮状态
private var chose :Bool = false lazy var imageView: UIImageView = { let imageView = UIImageView()
imageView.isUserInteractionEnabled = true
imageView.image = self.normalImage let tap = UITapGestureRecognizer.init(target: self, action: #selector(imageViewTap))
imageView.addGestureRecognizer(tap)
return imageView
}() lazy var emitterLayer: CAEmitterLayer = { let emitterLayer = CAEmitterLayer()
/// 设置发射源的形状
emitterLayer.emitterShape = .circle
/// 设置发射的模式
emitterLayer.emitterMode = .outline
/// 设置粒子cells
emitterLayer.emitterCells = [self.emitterCell] return emitterLayer
}() lazy var emitterCell: CAEmitterCell = { let emitterCell = CAEmitterCell()
/// 设置粒子
emitterCell.name = emitterName
/// 设置粒子速度
emitterCell.velocity = 40
/// 设置粒子范围
emitterCell.velocityRange = 70
/// 设置粒子参数的速度乘数因子
emitterCell.birthRate = 0
/// 设置粒子生命周期
emitterCell.lifetime = 1.0
/// 设置粒子透明度在生命周期内的改变速度
emitterCell.alphaSpeed = -1
/// 设置粒子要展现的图片,是个 CGImageRef 的对象
emitterCell.contents = self.effectlImage?.cgImage return emitterCell
}() convenience init(frame: CGRect, andNormalImage normalImage:String,
andSelectedImage selectedImage:String,
andEffectImage effectlImage:String) { self.init(frame:frame)
self.normalImage = UIImage(named: normalImage)
self.selectedImage = UIImage(named: selectedImage)
self.effectlImage = UIImage(named: effectlImage) addSubViews()
} func addSubViews() { imageView.frame = self.bounds
self.addSubview(self.imageView) emitterLayer.emitterPosition = CGPoint(x: self.frame.width/2.0, y: self.frame.height/2.0)
emitterLayer.emitterSize = CGSize(width: self.frame.width, height: self.frame.height)
self.layer.addSublayer(self.emitterLayer)
} /// 点击事件
@objc func imageViewTap() { self.chose = !self.chose
self.setCurrentImage()
imageView.bounds = CGRect.zero
UIView.animate(withDuration: 0.25, delay: 0, options: .curveLinear , animations: { self.imageView.bounds = self.bounds
if(self.chose) { /// 这里我们设置的是粒子的扩散动画,注意下面这个keyPath
/// emitterCells 是cells
/// emitterButton 是粒子的名称
/// birthRate
let baseAnimation = CABasicAnimation.init(keyPath: "emitterCells.emitterButton.birthRate")
baseAnimation.fromValue = NSNumber.init(value: 200)
baseAnimation.toValue = NSNumber.init(value: 0)
baseAnimation.duration = 0;
baseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
/// 添加动画 Key就是粒子名称 (这个自己设定)
self.emitterLayer.add(baseAnimation, forKey: "HHHHHHH")
}
}, completion: nil) } /// 设置图片
func setCurrentImage() { if self.chose {
imageView.image = selectedImage
}else{
imageView.image = normalImage
}
}
}
总结
通过上面的东西你可以简单的认识一下 QuartzCore,总的来说就是区分清楚 QuartzCore、CoreGraphics 甚至和CoreImage框架的区分等,这样一扯就扯远了 再比如说到CoreImage那你就还得和GPUImage一起了解一下,看一下他们之间的区别联系和结合使用等等,这些知识可能都不是我们经常会使用到的东西,但这些真的才是重要的知识点呀,多多学习多多提高我们的能力。
傻傻分不清:Quartz2D、QuartzCore、CoreAnimation、CoreImage、CoreGraphics
QuartzCore的更多相关文章
- QuartzCore笔记
Quartz Core 图层编程 一.添加 Quartz Core 框架 要使用 Quartz Core 框架,你需要将其添加到你的工程中 . 然后 #import <Quartz Core/Q ...
- CoreGraphics QuartzCore CGContextTranslateCTM 用法
原点是: 左下角 旋转: 逆时针 位移: 右上为正, 左下为负 CGContextTranslateCTM CGContextRotateCTM CGContextScaleCTM 而且, 以上几 ...
- 【转】 CoreGraphics QuartzCore CGContextTranslateCTM 用法
原文:http://blog.csdn.net/sqc3375177/article/details/25708447 CoreGraphics.h 一些常用旋转常量 #define M_E 2.71 ...
- IOS QuartzCore核心动画框架
IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...
- CoreGraphics QuartzCore CGContextTranslateCTM 说明
CoreGraphics.h 一些经常使用旋转常量 #define M_E 2.71828182845904523536028747135266250 e #define M_LOG2E 1.442 ...
- 在lldb调试中调用c++函数 - 如何使用QuartzCore里面的日志消息
承接上一篇,上一篇讲到可以在lldb调试中调用QuartzCore.framework里的CA::Render::Object::show方法来是观察CA::Render模块内的类的信息,但是在lld ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- 在linux平台实现atosl
➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...
- 谈谈iOS Animation
零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可 ...
随机推荐
- vue iframe嵌套页面高度自适应 (ios 宽度扩大的bug , ios展示比例问题)
<template> <div class="card-index pt-relative"> <div id="wrapper ...
- PHP两个变量值互换(不用第三变量)
<?php /** * 双方变量为数字或者字符串时 * 使用list()和array()方法可以达到交换变量值得目的 */ $a = "This is A"; // a ...
- Flex AIR应用GPS定位功能(Android和IOS)
说明: 使用AIR进行GPS定位功能实现时,会经常判断GPS是否打开.一般的官方或者书上的介绍的方法,测试后,只能对Android系统进行判断,而对ios系统则无法进行判断. 经过研究测试,终于解决实 ...
- 如何安装Anaconda和Python
1.下载安装文件 https://www.anaconda.com/download/ 2.百度安装方法:https://jingyan.baidu.com/article/3f16e0031e875 ...
- H3C 显示OSPF的链路状态数据库
- python基础十四之匿名函数
匿名函数 处理简单问题的简化函数,关键字lambda. # 格式:函数名 = lambda 参数:返回值 anonymity = lambda s: s ** 0.5 print(anonymity( ...
- Python--day37--守护进程和几个常用的方法
1,p.daemon = True #设置子进程为守护进程 #守护进程会随着主进程的代码执行完毕 而结束 #子进程 --> 守护进程 import time from multiprocessi ...
- 高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案
(1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常, 客户端出现connect ...
- 代码片段 Powershell修改桌面壁纸
其实只不过是利用了win32函数 function Set-Wallpaper($image){ $source = @" using System; using System.Runtim ...
- multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
情景再现: 上传文件到.net(wcf)后台时,总是上传不成功,后台要求Content-Type是application/octet-stream,我使用multipart/form-data方式,c ...