2013-09-25 36 views
3

我在我的視圖底部有一個工具欄。有一個叫做掃描的UIBarButton需要檢測什麼時候有人握住他們的手指並擡起手指。UIButton通過UIToolBar通過UITabBar觸摸未檢測到的Modal視圖

由於UIBarButton繼承自UIControl,我無法檢測到這一點。作爲一種解決方法,我創建了一個不可見的UIButton,並將其放置在我的工具欄頂部,只需從它檢測觸摸而不是UIBarButton。

這工作正常,直到我作爲模態視圖呈現視圖(它隱藏UITabBar),如果我觸摸工具欄將無法檢測到它。如果我觸摸上方的工具欄,它工作正常。

下面是截圖。 (隱形按鈕已被染成紅色,並延伸到高大用於測試)

working state

下面的截圖,如果你摸哪裏工具欄沒有任何反應。但在它之上它是紅色它完美地工作。

enter image description here

下面是我的一些代碼。

- (IBAction) scanTouchUp:(id)sender { 
    [linea barcodeStopScan:nil]; 
} 

- (IBAction) scanTouchDown:(id)sender { 
    [linea barcodeStartScan:nil]; 
} 

這些方法分別附着在「Touch Down」和「Touch Up Inside/Outside」上。

任何幫助,將不勝感激。

+0

那麼紅色的部分是您仍然想要在Modal View中檢測到觸摸的位置?只有紅色部分? – Unheilig

+0

是的,紅色框下面是一個說明「掃描」的uibarbutton項目。當你按住紅色部分時,它會激活條形碼掃描器外圍設備。 – Hackmodford

回答

1

如果UIButton超出了其父視圖的邊緣,或者覆蓋了不同後代視圖的一部分,則可能是按鍵測試不起作用。 (即,按鈕位於底部的條的頂部上方)。

您可以通過確保該按鈕被命中測試來解決這些問題。您可以通過覆蓋包含該按鈕的視圖上的hitTest:withEvent:方法來完成此操作。這可能是這個樣子:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *result = [redButton hitTest:[redButton convertPoint:point fromView:self] withEvent:event]; 
    if (result) 
    return result; 

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

如果您要添加這一變化的視圖之前包含給定點另一種觀點認爲擊中測試這隻會工作。

+0

借調,它幾乎可靠地通過了測試。在超級視圖邊界之外繪製的視圖是可見的,但不可點擊。在視圖中將'clipsToBounds'設置爲'YES'將有助於調試這類問題。 – cbowns

+0

我得到「沒有可見@interface爲'UIViewController'聲明選擇器'hitTest:withEven:'爲」返回[超級hitTest:點與事件:事件]; – Hackmodford

+0

我必須繼承UIView這樣做的權利? – Hackmodford

0

除了手動創建工具欄上的隱形按鈕的,嘗試創建一個UIBarButton實例與

- (id)initWithCustomView:(UIView *)customView

,並把它添加到工具欄,因爲每個其他項目。

此自定義視圖(傳遞給上述方法)將是一個「掃描」按鈕。然後,您可以按照自己的意願處理它,而無需使用一些不可見的控件。

+0

我試過這個,它完全一樣的東西:( – Hackmodford

0

你可以試試這個。我認爲你需要首先將你的工具欄添加到子視圖中。然後只有你添加你的不可見按鈕到子視圖。確保他們都有相同的超級景觀。