簡體   English   中英

iphone / ipad - 父UIView阻止了訪問子視圖 - 為什么?

[英]iphone/ipad - parent UIView is blocking touches from getting to subviews - why?

我有一個UIView,它有一堆子視圖。 子視圖應該能夠接收觸摸事件,但由於某種原因,父UIView接受觸摸並且不傳遞它。 我以非常標准的方式創建它,就像我總是創建視圖一樣:

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)];
    self.mainView = myView;
    [myView release];

    [self.view addSubview:self.mainView];

然后我創建子視圖並正常添加它們:

[self.mainView addSubview:someOtherView];

我知道self.mainView在我在主UIWindow中收聽時會得到觸摸事件:

VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768);

但為什么在這個世界上我不能讓子視圖接受接觸? 我不明白為什么有時會發生這種情況。 我沒有改變mainView的任何默認屬性。

與父視圖的框架有關。 如果框架未包含子視圖,則它們將不會接收到觸摸。

UIView觸摸不會傳遞給子視圖,如果它們位於解決方案所提到的超視圖范圍之外。

但是,如果您希望這些子視圖響應觸摸,請覆蓋hitTest:withEvent: .

事件傳遞文檔

觸摸事件。 窗口對象使用命中測試和響應者鏈來查找接收觸摸事件的視圖。 在命中測試中,窗口在視圖層次結構的最頂層視圖上調用hitTest:withEvent: 此方法通過在視圖層次結構中返回YES的每個視圖上遞歸調用pointInside:withEvent:繼續執行,繼續向下移動層次結構,直到找到觸摸發生在其邊界內的子視圖。 該視圖成為熱門測試視圖。

  1. 創建UIView(或其他UIView子類)的子類。
  2. 覆蓋hitTest:withEvent。
  3. 使用此UIView子類作為超級視圖,因此子視圖可以響應觸摸。

在子類中添加以下方法:

(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
    UIView *iSubView;

    while ((iSubView = [reverseE nextObject])) {

        UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
        if(viewWasHit) {
            return viewWasHit;
        }

    }
    return [super hitTest:point withEvent:event];
}

注意:從子視圖開始使用的反向枚舉器是從后到前排序的,我們希望首先測試最前面的視圖。

你是否觸摸處理程序調用超類處理程序?

例如,在你的觸摸開始,打電話:

[super touchesBegan:touches withEvent:event];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM