UIView和CALayer和有什么關(guān)系
- UIview中有個(gè)屬性layer朱盐,是CALayer類(lèi)型。
- CALayer包含要顯示的內(nèi)容contents和backgroundcolor恨旱,實(shí)際上UIView的backgroundcolor是重寫(xiě)CALayer的backgroundcolor痕慢。
- CALayer的contents中是backing store實(shí)際上是bitmap類(lèi)型的位圖冈在,我們可以理解為顯示到屏幕上的都是位圖瓷产。
UIView和CALayer和有什么區(qū)別
- UIView為CALayer顯示提供基礎(chǔ)站玄,UIView負(fù)責(zé)處理觸摸等事件,參與事件響應(yīng)鏈濒旦。
- CALayer只是負(fù)責(zé)提供顯示的內(nèi)容contents
- 為什么如此設(shè)計(jì)株旷?遵循單一職責(zé)設(shè)計(jì)模式
事件傳遞與視圖響應(yīng)鏈
// recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
// 判斷點(diǎn)擊的位置并返回被點(diǎn)擊的view
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;
// default returns YES if point is in bounds
// 判斷點(diǎn)擊的位置是否在當(dāng)前視圖的范圍內(nèi)
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;
- 事件傳遞流程
QQ20181110-230934@2x.png
- 點(diǎn)擊屏幕時(shí)首先將事件傳遞給UIApplication,UIApplication將事件傳遞給UIWindow
- UIWindow調(diào)用hitTest返回響應(yīng)視圖尔邓,先通過(guò)pointInside:判斷是否在UIWindow范圍內(nèi)晾剖,如果在的話(huà)會(huì)通過(guò)倒序的方式遍歷UIWIndow的子視圖找出響應(yīng)視圖,最后添加的子視圖會(huì)最先調(diào)用hitTest方法梯嗽,遞歸調(diào)用hitTest返回找到的視圖齿尽。
- 視圖響應(yīng)鏈
QQ20181110-231003@2x.png
視圖事件響應(yīng)方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- UIResponder的方法,UIView繼承自UIResponder慷荔,響應(yīng)觸摸方法
- UIView不處理觸摸事件則一層層往上傳遞直到UIWindow(視圖響應(yīng)鏈)
- 如果都不處理則忽略