簡體   English   中英

UIView,它的超級視圖和touchesBegan:

[英]UIView, its superview and touchesBegan:

假設我有一個UIViewController子類來處理一些UIViews。 這些UIViews被添加為UIViewController的view屬性的子視圖:

UIViewController中:

- (void)viewDidLoad {
    UIImageView *smallImageView...
    [self.view addSubview:smallImageView];

    UIButton *button..
    [self.view addSubview:button];

    UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
    [self.view addSubview:bigUIView];
...
}

AFAIK,因為bigUIView是最前面的視圖並覆蓋整個屏幕,它將接收touchesBegan:withEvent:和其他視圖,如button不會接收任何觸摸事件。

在我的應用程序中, bigUIView必須是最頂層的視圖,因為它包含主要的用戶界面對象(CALayers,實際上是主要的游戲對象),在動畫時,必須位於所有其他輔助UI元素(UIButtons等)之上。 但是,我希望能夠在響應程序鏈中保留UIButtons和其他對象。

我嘗試在bigUIView類中實現以下內容:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    
    [self.superview touchesBegan:touches withEvent:event];

    ... hit test the touch for this specific uiview..
}

筆記:

  1. bigUIView引用了UIViewController的view屬性,它是否將觸摸事件傳播到它的所有子視圖?
  2. bigUIView必須有userInteractionEnabled = YES因為它還處理用戶輸入。
  3. 我無法將button / smallImageView置於前面,因為它會出現在主游戲對象( bigUIView子層) bigUIView

提前致謝。

嘗試重寫bigUIView pointInside:withEvent:bigUIView類中,如果該點位於背景視圖的其他子視圖之一的框架矩形內,則返回NO 由於它是這些其他視圖的兄弟,因此命中測試機制將繼續測試其他子視圖並找到與用戶觸摸的點相對應的子視圖。

Alos,考慮在UIViewController子類而不是bigUIView類中實現事件階段方法( -touchesBegan:withEvent:等)。 iOS在響應程序鏈中插入視圖后面的視圖控制器,因此事件消息將冒泡到視圖控制器,除非其他子視圖(例如,按鈕)中的一個攔截它。 然后,視圖控制器可以將您喜歡的任何消息發送到其任何視圖。

通常在響應者鏈中,事件傳遞給超級視圖,而不是子視圖。 無論如何,我會將事件中的點轉換為按鈕的本地坐標系,如果它命中,則向控制器發送一個動作。

暫無
暫無

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

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