亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

舉例講解iOS應用開發中hitTest觸摸事件的編寫方法

2020-07-26 03:22:57
字體:
來源:轉載
供稿:網友

 hitTest:withEvet  調用過程

比如如果是當前的View A, 還有一個viewB

如果不重寫 hitTest 方法,那么 系統默認是先調用viewA的hitest 方法,然后再調用viewB的htest方法。

系統的調用過程,跟下面的重寫hitest的方法是一模一樣的。

復制代碼 代碼如下:

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 

    if ([self pointInside:point withEvent:event]) { 
    } 
    else { 
        return nil; 
    } 
    for (UIView *subView in self.subviews) { 
        if ([subView hitTest:point withEvent:event]!=nil) { 
            return subView; 
        } 
    } 
     
    return self; 


在說明一次,如果不重寫hitest方法,那么每一個UIVIeew的默認hitest的方法都是上面這個處理流程。

那也沒啥好說的。

但是對于一些特殊的處理過程,就不行了

所以之所以重寫hitTest方法,通常都是為了穿透上層 的 UIview,讓touch事件可以達到下面的uiview,

比如 view A  和 VIew B,

View b完全擋住了view A,但是我想讓點擊viewB的時候,view A可以響應點擊的事件。就可以采用下面的方法:

復制代碼 代碼如下:

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 

    if ([self pointInside:point withEvent:event]) { 
        NSLog(@"in view A"); 
        return self; 
    } 
    else { 
        return nil; 
    } 
 

深入
我們來更深入一下,現在有個實例需求界面如下,

Window

  -ViewA

    -ButtonA

    -ViewB

      -ButtonB

層次結構:ViewB完全蓋住了ButtonA,ButtonB在ViewB上,現在需要實現:
(1)ButtonA和ButtonB都能響應消息 (2)ViewA也能收到ViewB所收到的touches消息 (3)不讓ViewB(ButtonB)收到消息。

(首先解析下,默認情況下,點擊了ButtonB的區域,iOS消息處理過程。

-ViewA

  -ButtonA

  -ViewB

    -ButtonB

當點擊ButtonB區域后,處理過程:從ViewA開始依次調用hitTest

pointInside的值依次為:

ViewA:NO;

ViewB:YES;

ButtonB:YES;

ButtonB的subViews:NO;

所以ButtonB的subViews的hitTest都返回nil,于是返回的處理對象是ButtonB自己。接下去開始處理touches系列方法,這里是調用ButtonB綁定的方法。處理完后消息就停止,整個過程結束。)

分析:

實現的方式多種,這里將兩個需求拆解開來實現,因為實現2就可以滿足1。

需求1的實現,ViewB蓋住了ButtonA,所以默認情況下ButtonA收不到消息,但是在消息機制里尋找消息響應是從父View開始,所以我們可以在ViewA的hitTest方法里做判斷,若touch point是在ButtonA上,則將ButtonA作為消息處理對象返回。

代碼如下:

復制代碼 代碼如下:

#pragma mark - hitTest
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 當touch point是在_btn上,則hitTest返回_btn
    CGPoint btnPointInA = [_btn convertPoint:point fromView:self];
    if ([_btn pointInside:btnPointInA withEvent:event]) {
        return _btn;
    }
    
    // 否則,返回默認處理
    return [super hitTest:point withEvent:event];
    
}

這樣,當觸碰點是在ButtonA上時,則touch消息就被攔截在ViewA上,ViewB就收不到了。然后ButtonA就收到touch消息,會觸發onClick方法。

需求2的實現,上面說到響應鏈,ViewB只要override掉touches系列的方法,然后在自己處理完后,將消息傳遞給下一個響應者(即父View即ViewA)。

代碼如下:在ViewB代碼里

復制代碼 代碼如下:

#pragma mark - touches
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"B - touchesBeagan..");
    
    // 把事件傳遞下去給父View或包含他的ViewController
    [self.nextResponder touchesBegan:touches withEvent:event];
}
 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"B - touchesCancelled..");
    // 把事件傳遞下去給父View或包含他的ViewController
    [self.nextResponder touchesBegan:touches withEvent:event];
}
 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"B - touchesEnded..");
    // 把事件傳遞下去給父View或包含他的ViewController
    [self.nextResponder touchesBegan:touches withEvent:event];
}
 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"B - touchesMoved..");
    // 把事件傳遞下去給父View或包含他的ViewController
    [self.nextResponder touchesBegan:touches withEvent:event];
    
}

然后,在ViewA上就可以接收到touches消息,在ViewA上寫:
復制代碼 代碼如下:

#pragma mark - touches
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"A - touchesBeagan..");
}
 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"A - touchesCancelled..");
}
 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"A - touchesEnded..");
}
 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"A - touchesMoved..");
    
}

這樣就實現了向父View透傳消息。

不讓ViewB收到消息,可以設置ViewB.UserInteractionEnable=NO;除了這樣還可以override掉ViewB的ponitInside,原理參考上面。

在ViewB上寫:

復制代碼 代碼如下:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // 本View不響應用戶事件
    return NO;
 
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
92版电视剧仙鹤神针在线观看| 精品久久久久久中文字幕| 97视频网站入口| 日韩精品视频在线免费观看| 欧美精品在线观看91| 亚洲精品国产美女| 国产一区二区av| 亚洲性av网站| 久久精品视频中文字幕| 91欧美精品成人综合在线观看| 成人免费激情视频| 亚洲精品天天看| 操人视频在线观看欧美| 91中文字幕一区| 都市激情亚洲色图| 91在线视频精品| 日韩毛片在线看| 亚洲白拍色综合图区| 2019中文字幕在线观看| 国产精品自产拍在线观看| 色噜噜国产精品视频一区二区| 97国产精品免费视频| 亚洲欧美国产va在线影院| 成人性生交大片免费看小说| 欧美激情国内偷拍| 亚洲男人天堂2023| 日本精品久久久久影院| 日韩av大片免费看| 欧美极品少妇xxxxⅹ裸体艺术| 日韩大片免费观看视频播放| 久久精品国产清自在天天线| 国产999精品久久久影片官网| 亚洲精品日产aⅴ| 亚洲国产天堂久久综合网| 亚洲曰本av电影| 色黄久久久久久| 不卡在线观看电视剧完整版| 国内成人精品视频| 97免费视频在线播放| 亚洲自拍偷拍第一页| 美女av一区二区三区| 第一福利永久视频精品| 久久99久国产精品黄毛片入口| 日本精品一区二区三区在线| 国产精品成人观看视频国产奇米| 2019亚洲男人天堂| 国产精品激情av电影在线观看| 国产精品伦子伦免费视频| 欧美日产国产成人免费图片| 国产精品女人久久久久久| 久久99青青精品免费观看| 91精品国产高清自在线看超| 国产精品欧美激情| 91精品国产自产在线老师啪| 亚洲国产日韩欧美在线99| 久久久亚洲精品视频| 91九色单男在线观看| 久久久久国产精品www| 亚洲免费av片| 九九热99久久久国产盗摄| 2025国产精品视频| 中文字幕免费精品一区| xx视频.9999.com| 国产成人免费av| 国产精品久久久久久久久久新婚| 欧美日韩免费区域视频在线观看| 自拍偷拍亚洲欧美| 国产精品大片wwwwww| 日韩av免费看| 一个人www欧美| 日韩美女视频免费在线观看| 欧美日韩在线第一页| 久久久97精品| 韩曰欧美视频免费观看| 精品国产1区2区| 精品人伦一区二区三区蜜桃网站| 一夜七次郎国产精品亚洲| 亚洲视频在线播放| 国产精品黄色av| 国产成人精品免费久久久久| 日韩在线免费观看视频| 欧美激情精品久久久久久变态| 色妞欧美日韩在线| 欧美在线www| 久久精品国产亚洲7777| 久久久999精品视频| 日韩精品在线免费| 18久久久久久| 成人黄色生活片| 亚洲成人a**站| 国产91精品久久久久久久| 欧美成人精品在线播放| 精品美女久久久久久免费| 欧美激情精品久久久久久变态| 日韩av片电影专区| 欧美成人午夜视频| 中文欧美在线视频| 夜夜嗨av色综合久久久综合网| 国产精品一区二区久久久久| 亚洲电影免费观看高清完整版在线观看| 亚洲女人被黑人巨大进入al| 国产视频丨精品|在线观看| 久热国产精品视频| 亚洲人成电影网站色www| 91精品国产91久久久久久最新| 久久久91精品国产| 国产精品久久av| 中日韩午夜理伦电影免费| 国产午夜精品理论片a级探花| 欧美性猛交xxx| 欧美激情在线狂野欧美精品| 亚洲黄色成人网| 不卡在线观看电视剧完整版| 亚洲国产精品久久久久久| 91精品综合久久久久久五月天| 麻豆国产精品va在线观看不卡| 亚洲精品国精品久久99热| 国产日韩在线播放| 亚洲精品日韩在线| 欧美一级视频一区二区| 色播久久人人爽人人爽人人片视av| 美日韩在线视频| 九九视频直播综合网| 欧美体内谢she精2性欧美| 亚洲a在线观看| 国产伦精品一区二区三区精品视频| 欧美性视频精品| 久久99热精品这里久久精品| 欧美韩日一区二区| 国产成人在线视频| 北条麻妃久久精品| 国产不卡av在线免费观看| 欧美精品成人91久久久久久久| 欧美色视频日本高清在线观看| 日韩黄在线观看| 国产精品福利久久久| 成人乱人伦精品视频在线观看| 欧美激情中文网| 精品在线欧美视频| 亚洲午夜小视频| 91高清免费在线观看| 国产成人精品综合| 亚洲在线第一页| 成人黄色av网站| 欧美精品第一页在线播放| 国产精品香蕉av| 超碰91人人草人人干| 91av视频在线播放| 亚洲护士老师的毛茸茸最新章节| 国产精品入口夜色视频大尺度| 久久成人人人人精品欧| 九九久久久久久久久激情| 国产精品久久久久久久久久久久| 亚洲永久免费观看| 国产伦精品一区二区三区精品视频| 92国产精品久久久久首页| 一区二区成人av| 国产精品永久在线| 亚洲淫片在线视频| 国产精品九九久久久久久久| 国产欧美精品一区二区三区介绍| 久久久这里只有精品视频| 国产成人avxxxxx在线看| 91精品在线观|