2012-05-22 40 views
4

我有一個三視圖控制器和視圖。iOS外的UIButton框架沒有觸發touchinside事件

一個包含主視圖,另一個包含自定義導航欄,第三個包含視圖(也稱爲第三個視圖控制器的子視圖)。

當應用程序被加載時,導航欄視圖將與子視圖一起可見。在子視圖中,我有一個按鈕,我想放置在導航欄視圖的頂部。不幸的是,我不能直接使用navigationitem.setrightbutton之類的東西......或者其他任何類似的方法(所有東西都是編碼的,沒有筆尖)。

所以我正在做的是將我的按鈕框架y值設置爲負值。這意味着該按鈕不在子視圖的邊框範圍內,但它實現了我想要的,即將按鈕放置在導航欄上。

遺憾的是沒有點擊事件傳遞的按鈕,因爲它是子視圖幀邊界之外...

我試圖重寫pointinside和則hitTest的觀點,但沒有什麼工作。

我希望我已經說清楚了。任何可以解決這個問題的代碼都會受到重視。

+0

add this,[btnName setUserInteractionEnabled:YES]; –

回答

2

觸摸事件只在視圖範圍內傳播。儘管可以將子視圖放置在父級邊界之外並仍然可以看到它,但事件不會傳遞給它。

處理事件的基本機制是的UIView以下方法:

​​

此方法負責決定哪些查看給定觸摸事件應該去。當你觸摸屏幕時,調用根視圖(窗口)的hitTest方法,它將調用它的子視圖上的方法,並且他們將調用子視圖上的方法,等等。

原則上,您可以創建一個自定義窗口類並覆蓋窗口中的hitTest方法,以強制它將事件轉發到按鈕,即使它超出了其父窗口的邊界,但這樣做很不正確。這將是這樣的:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGRect rect = WORK_OUT_WHERE_THE_BUTTON_RECT_IS_RELATIVE_TO_THE_WINDOW; 
    if (CGRectContainsPoint(rect, point)) 
    { 
     return theButtonView; 
    } 
    else 
    { 
     return [super hitTest:point withEvent:event]; 
    } 
} 

相反,我建議您可以節省很多的麻煩,並通過添加按鈕,導航欄的子視圖,而不是使用負定位到地方改變您的應用程序的工作方式它在那裏。