你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 舉例講授iOS運用開辟中hitTest觸摸事宜的編寫辦法

舉例講授iOS運用開辟中hitTest觸摸事宜的編寫辦法

編輯:IOS開發綜合

 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;
 
}

【舉例講授iOS運用開辟中hitTest觸摸事宜的編寫辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved