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;
事件傳遞流程
點(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)鏈
視圖事件響應(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)鏈)
如果都不處理則忽略
最后編輯于 :2018.11.10 23:11:29
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者