在iOS開發(fā)中,你可能都用到過這些知識點(diǎn)入挣,但是并沒有仔細(xì)區(qū)分過亿乳,正所謂,百姓日用而不知径筏,現(xiàn)在就來細(xì)說一下他們之間的區(qū)別和聯(lián)系葛假。
1. CoreGraphics
這是一個C語言寫就的庫,來看看他的頭文件:
#ifndef COREGRAPHICS_H_
#define COREGRAPHICS_H_
#include <CoreGraphics/CGBase.h>
#include <CoreGraphics/CGAffineTransform.h>
#include <CoreGraphics/CGBitmapContext.h>
#include <CoreGraphics/CGColor.h>
#include <CoreGraphics/CGColorConversionInfo.h>
#include <CoreGraphics/CGColorSpace.h>
#include <CoreGraphics/CGContext.h>
#include <CoreGraphics/CGDataConsumer.h>
#include <CoreGraphics/CGDataProvider.h>
#include <CoreGraphics/CGError.h>
#include <CoreGraphics/CGFont.h>
#include <CoreGraphics/CGFunction.h>
#include <CoreGraphics/CGGeometry.h>
#include <CoreGraphics/CGGradient.h>
#include <CoreGraphics/CGImage.h>
#include <CoreGraphics/CGLayer.h>
#include <CoreGraphics/CGPDFArray.h>
#include <CoreGraphics/CGPDFContentStream.h>
#include <CoreGraphics/CGPDFContext.h>
#include <CoreGraphics/CGPDFDictionary.h>
#include <CoreGraphics/CGPDFDocument.h>
#include <CoreGraphics/CGPDFObject.h>
#include <CoreGraphics/CGPDFOperatorTable.h>
#include <CoreGraphics/CGPDFPage.h>
#include <CoreGraphics/CGPDFScanner.h>
#include <CoreGraphics/CGPDFStream.h>
#include <CoreGraphics/CGPDFString.h>
#include <CoreGraphics/CGPath.h>
#include <CoreGraphics/CGPattern.h>
#include <CoreGraphics/CGShading.h>
#endif /* COREGRAPHICS_H_ */
通過頭文件可以看到滋恬,CoreGraphics的類名都是以CG開頭的聊训,平時所用的CGRect、CGPoint就在CGGeometry這個幾何相關(guān)的類中定義恢氯,CGFont類則被封裝成了UIFont魔眨,CGImage構(gòu)成了UIImage,CGContext是繪圖的上下文等等酿雪。所以CoreGraphics是系統(tǒng)繪制界面、文字侄刽、圖像等UI的基礎(chǔ)指黎。
2. Quartz2D
這是一個基于CoreGraphics API的繪圖框架,系統(tǒng)中并沒有Quartz2D.framework這么一個庫州丹,他只是包含了CoreGraphics中的部分API醋安,是一個抽象的引擎,并不是一個實(shí)體墓毒,他在iOS和MAC系統(tǒng)中負(fù)責(zé):
- 繪制圖形 : 線條\三角形\矩形\圓\弧等
- 繪制文字
- 繪制\生成圖片(圖像)
- 讀取\生成PDF
- 截圖\裁剪圖片
- 自定義UI控件
PS:因?yàn)槭茿PI是C語言寫成的吓揪,所以ARC并不起作用,仍然需要手動管理內(nèi)存所计。
3.QuartzCore和CoreAnimation
打開QuartzCore的頭文件可以看到
#ifndef QUARTZCORE_H
#define QUARTZCORE_H
#include <QuartzCore/CoreAnimation.h>
#endif /* QUARTZCORE_H */
QuartzCore就是引用了CoreAnimation的頭文件,所以這兩個實(shí)際上是同一個主胧,是雌雄同體。踪栋。焙格。夷都。
CoreAnimation中文名核心動畫,看名字是負(fù)責(zé)動畫的,其實(shí)不然蛤虐,作用相當(dāng)大,來看看他的頭文件
#ifndef COREANIMATION_H
#define COREANIMATION_H
#include <QuartzCore/CABase.h>
#include <QuartzCore/CATransform3D.h>
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <QuartzCore/CAAnimation.h>
#import <QuartzCore/CADisplayLink.h>
#import <QuartzCore/CAEAGLLayer.h>
#import <QuartzCore/CAEmitterBehavior.h>
#import <QuartzCore/CAEmitterCell.h>
#import <QuartzCore/CAEmitterLayer.h>
#import <QuartzCore/CAGradientLayer.h>
#import <QuartzCore/CALayer.h>
#import <QuartzCore/CAMediaTiming.h>
#import <QuartzCore/CAMediaTimingFunction.h>
#import <QuartzCore/CAReplicatorLayer.h>
#import <QuartzCore/CAScrollLayer.h>
#import <QuartzCore/CAShapeLayer.h>
#import <QuartzCore/CATextLayer.h>
#import <QuartzCore/CATiledLayer.h>
#import <QuartzCore/CATransaction.h>
#import <QuartzCore/CATransform3D.h>
#import <QuartzCore/CATransformLayer.h>
#import <QuartzCore/CAValueFunction.h>
#endif
#endif /* COREANIMATION_H */
以CA開頭的都是他的類笆焰,其中帶layer的類是構(gòu)成UIView的基石见坑,用來呈現(xiàn)內(nèi)容。其中:
- CAShapeLayer
用來根據(jù)CGPath來渲染的圖層荞驴,這里CGPath就是上文中提到的CoreGraphics的一部分不皆,比如常做的圓角霹娄,都是用cornerRadius來做,但是這是四個角都有的鲫骗,要想做一個角的就得用他了犬耻。 - CATextLayer
這個layer可以呈現(xiàn)文字,包含了UILabel的功能执泰,如果你閑的蛋疼枕磁,也可以用他來實(shí)現(xiàn)一個label。 - CAGradientLayer
是用來生成兩種或更多顏色平滑漸變的术吝。 - CAReplicatorLayer
是為了高效生成許多相似的圖層计济。它會繪制一個或多個圖層的子圖層,并在每個復(fù)制體上應(yīng)用不同的變換排苍。 - CAScrollLayer
有點(diǎn)像UIScrollView沦寂,可以用來呈現(xiàn)比他大的內(nèi)容。 - CATiledLayer
Tiled意思的瓷磚淘衙,就像鋪地板一樣传藏,可以把一個很大的圖片,切成一格一格的來呈現(xiàn)彤守。 - CAEAGLLayer
用來進(jìn)行OpenGL繪圖的工作漩氨,需要有OpenGL的基礎(chǔ)。
這其中可能存在疑問遗增,比如既然有了CATextLayer叫惊,為啥還要UILabel,有了CAScrollLayer還要有UIScrollView做修。答案是layer層只能呈現(xiàn)視圖霍狰,不能響應(yīng)用戶事件抡草,比如輸入,點(diǎn)擊蔗坯,拖拽等康震,所以才會有UIKit對layer的封裝,用來處理事件宾濒,然后用layer來呈現(xiàn)內(nèi)容腿短。
CAAnimation類繼承與NSObject,他是一個抽象類绘梦,并不直接負(fù)責(zé)動畫橘忱,他有一個子類CAPropertyAnimation,也是抽象類卸奉。CAPropertyAnimation的兩個子類才直接對layer層進(jìn)行動畫操作钝诚,其中CABasicAnimation負(fù)責(zé)基礎(chǔ)動畫,CAKeyframeAnimation負(fù)責(zé)關(guān)鍵幀動畫榄棵。
帶有Emitter的類是負(fù)責(zé)粒子動畫的類凝颇,可以用來做炫酷的粒子動畫。
帶有Trans的類負(fù)責(zé)仿射動畫疹鳄,所謂仿射拧略,就是模仿陽光照射,就有了立體的感覺瘪弓,可以做三維空間的變換辑鲤,不像CAAnimation,只能在平面上動手腳弛随。
CAMediaTiming是一個協(xié)議,里邊規(guī)定了幾個屬性栓票,用來精確控制時間愕够,animation和layer實(shí)現(xiàn)了這個協(xié)議惑芭。
4. CoreImage
照例,來看看頭文件
#ifdef __OBJC__
#import <CoreImage/CoreImageDefines.h>
#import <Foundation/Foundation.h>
#define UNIFIED_CORE_IMAGE 1
#import <CoreImage/CIVector.h>
#import <CoreImage/CIColor.h>
#import <CoreImage/CIImage.h>
#import <CoreImage/CIContext.h>
#import <CoreImage/CIFilter.h>
#import <CoreImage/CIKernel.h>
#import <CoreImage/CIDetector.h>
#import <CoreImage/CIFeature.h>
#import <CoreImage/CIImageProvider.h>
#import <CoreImage/CIImageProcessor.h>
#import <CoreImage/CIImageAccumulator.h>
#import <CoreImage/CIFilterConstructor.h>
#import <CoreImage/CIFilterShape.h>
#import <CoreImage/CISampler.h>
#import <CoreImage/CIRAWFilter.h>
#if !TARGET_OS_IPHONE
#import <CoreImage/CIFilterGenerator.h>
#import <CoreImage/CIPlugIn.h>
#endif
#endif /* __OBJC__ */
頭文件里可以看出來逃沿,這個庫主要針對圖片凯亮,跟上文里講到的不太相關(guān)。
早年間柠并,想要對圖片做濾鏡操作富拗,要用到一個叫GPUImage的第三方庫媒峡,如今,系統(tǒng)有了自己的庫半哟,可以對圖片進(jìn)行操作寓涨。其中CIFilter定義了各種濾鏡氯檐,比如把圖片變成黑白的,變成仿古的糯崎。還有以前流行的模糊圖片等等沃呢,在美顏相機(jī)上做的拆挥,就能用這個庫來做。
總結(jié)
寫了這么多惰瓜,可能又蒙了崎坊,這里總結(jié)一下
1. Quartz2D是CoreGraphics的一部分API的抽象洲拇,不是實(shí)際存在的.framework
2. CoreGraphics定義了顏色、位置打月、字體、路徑柴淘、圖片等UIKit的常見屬性为严。是構(gòu)成UIKit的基石肺稀。
3. QuartzCore和CoreAnimation是雌雄同體的同義詞。
4. CoreAnimation定義了動畫類來對layer做動畫夕吻,定義了layer來呈現(xiàn)內(nèi)容涉馅。定義了仿射變換來做3D動畫。
5. CoreImage定義了濾鏡稚矿,來對圖片進(jìn)行顏色過濾混合等操作捻浦。
PS:UIKit里的UIView,封裝了layer來呈現(xiàn)內(nèi)容昧识,內(nèi)容通過CoreGraphics來繪制到layer上母剥,其中位置环疼、大小炫隶、顏色,也都在CoreGraphics里定義了伪阶。并且加上了用戶事件,用來響應(yīng)用戶的輸入斟湃、點(diǎn)擊檐薯、拖拽等操作。
才疏學(xué)淺坛缕,歡迎指正??