ios hitTest及扩展---分解ZFPlayer
核心1. 介紹
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event point :
在接收器的局部坐標系(界)中指定的點。 event : 系統保證調用此方法的事件。
如果從事件處理代碼外部調用此方法,則可以指定nil。 returnValue : 視圖對象是當前視圖和包含點的最遠的后代。
如果點完全位于接收方的視圖層次結構之外,則返回nil。
目的在于 :?在視圖的層次結構中尋找一個最適合的 view 來響應觸摸事件。
?
核心2.
調用順序:touch -> UIApplication -> UIWindow -> UIViewController.view -> subViews -> ....-> 合適的view
事件傳遞順序:view -> superView ...- > UIViewController.view -> UIViewController -> UIWindow -> UIApplication -> 事件丟棄
?
擴展1. subview超出fatherView的bounds仍然需要響應點擊事件
?
?
/*
?Case1: 點擊button1 & button2 不在self的區域都有效
?*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
?? ?
? ? //1.判斷自己能否接收事件
? ? if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {
? ? ? ? return nil;
? ? }
?? ?
? ? // 這里無需判斷point是否在父View的bounds內,因為middleButton和rightButton部分區域超出的父View
? ? for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
? ? ? ? CGPoint convertedPoint = [subview convertPoint:point fromView:self];
? ? ? ? UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
? ? ? ? if (hitTestView) {
? ? ? ? ? ? return hitTestView;
? ? ? ? }
? ? }
? ? return self;
?? ?
}
?
?
?
/*
?Case2: 點擊button1不在self的區域《無》效
? ? ? ? 點擊button2不在self的區域《有》效
?*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
?? ?
? ? //1.判斷自己能否接收事件
? ? if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {
? ? ? ? return nil;
? ? }
?
? ? CGPoint newPoint = [self convertPoint:point toView:button2];
? ? if ([button2 pointInside:newPoint withEvent:event]) {
? ? ? ? return button2;
? ? }
?? ?
? ? return [super hitTest:point withEvent:event];
}
?
參考資料:https://blog.csdn.net/qq_18505715/article/details/78411052
?
?
轉載于:https://www.cnblogs.com/madaha/p/9685180.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ios hitTest及扩展---分解ZFPlayer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ CodeForces 865 D ]
- 下一篇: 5G通信3大场景 来源:elecfans