使用者登入

全站搜尋

最新回應

論壇最新主題

論壇最新回覆

會員排行榜

線上使用者

目前共有 0 位註冊使用者7 位訪客 在線上。

事件的傳遞 - Event Delivery - 校稿中

babyfish0226
babyfish0226 的照片

原文連結:Event Delivery

翻譯作者:adammisko

文章校稿:校稿中

事件的傳遞 Event Delivery

一個事件傳送到一個物件往處理發生沿某一特定路徑。所述的"核心應用體系結構" ,當使用者觸摸螢幕上的一個裝置, iPhone的操作系統辦認一對觸及和包裹在一個UIevent物件,它放在當前應用程序的事件隊列(event queue)。

UIapplication物件
是 管理應用程式的取走事件從最高層的隊列(queue),並分派(dispatches)它。通常情況下,它發出這事件到應用程式的關鍵窗視,視窗正在集中 焦點為使用者事件和UIwindow物件是代表那個視窗,並將事件送到第一個回應者。 (第一個回應者,是在描述"回應者物件和回應鏈" ) 。

應 用程式使用 hit-testing,為一個事件以找出第一個回應者,它遞歸來呼叫hitTest : withEvent :對VIew在View的階層(往下階層),以確定subview其中觸摸發生。觸摸是組合與View供其一生中,即使後來的移動之外的View。 "事件處理技術" ,討論了一些綱領的hit-testing蘊涵 。

該UIApplication物件和每個UIwindow物件調遣 事件中sendEvent :方法。 (兩纇別申報相同的命名方法)。因為這些方法是注入點,為事件即將進入一個應用程式,你可以子類UIApplication或UIwindow和凌駕 sendEvent:方法去監測事件或執行特殊事件處理。不過,大部分應用程式不需要這樣做。

在這章節:
回應者物件和回應鏈
規範事件傳送

回應者物件和回應鏈
回 應者物件(responder object)是個物件可作出反應事件和處理它們。 UIResponder是回應者物件的基本類別。它界定了綱領介面性不僅為事件處理,但為共同回應者物件行為。 UIApplication , UIview ,以及所有UIkit類別的後裔從UIview (包括UIwindow )繼承直接或間接地來自UIResponder 。

先 第一回應者是回應者物件在應用程式(通常是一個UIview物件) ,這是目前觸動的接收。  UIwindow物件傳送第一回應者一個事件在訊息中,給它的第一個觸發,處理事件。如果先第一回應者不處理事件,它通過事件(通過訊息)到了一回應者在 回應鏈看看是否可以處理它。

回應鏈是相連的一系列回應者物件。它允許回應者物件,以派遺代表負責處理事件其他與層次較高的物體。一個事件的收益了回應者鏈中,由於應用程式找尋有能力處理事件的一個物件。該回應者鏈構成了一系列的"下一個回應者" ,順序如下。

1.第一回應者至它的superview ,View至它的superview ,且在View階層上面。
   
2.最上層封裝View至UIwindow物件。

3.UiWindow物件是單一的UIApplication物件。

如果應用程式認定,沒有回應者物件,以處理事件,它會摒棄了這項事件。

任何回應者物件在回應鏈中可以先實行一段時間UIResponder事件的處理方式,從而得到一個事件的信息。但回應者可能拒絕,以處理特定的事件或可處理它的一部分。在這種情況下,它可以把這項事件訊息傳到下一個回應者在訊息中,類似如下:

   
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = touches.anyObject;

    if (!(touch.info & UITouchInfoSwipedRight)) {

        [self.nextResponder touchesBegan:touches forEvent:event];

  } else {

        [self handleSwipeRight:touch];

  }

}

注:如果回應者物件傳遞事件處理信息至下一個以回應者的多點觸控序列的初始階段(in touchesBegan : withEvent : ) ,它應傳遞所有其他事件處理信息給多點觸控序列。

規律的事件傳遞

UIkit給應用程式綱領性方法,以簡化事件處理或關掉接二連三的事件完全針對一個時期。下列清單總結了這些方法:

.靠內定值,一個View忽略所有,但第一次接觸,在一個多點觸控序列。如果你想以View同時處理多個touches時,請呼叫setMultipleTouchEnabled :方法的UIiew物件,並給個Yes值。

.一個客製代UIview纇別夠凌駕 hitTest : withevent :限制多點觸控事件至subviews 。

. 一個應用程式可呼UIApplication方法beginIgnoringInteractionEvents之後來呼叫 endIgnoringInteractionEvents方法。第一種方法可以阻止應用程式,由接收多點觸控事件訊息;第二種方法是所謂的恢復收到上述 訊息。你有時想要關掉事件傳遞時,當你的程式碼是表演動畫。