2011-10-01 66 views
3

我有以下的UIView架構(X,Y,寬度,高度):如何在他的父視圖之外部分訪問uiview子視圖?

- MainWindow (0,0,768,1024) 
    - MainView (0,0,768,80) 
     - containerview (500,40,120,80) 
      - subview (500,40,120,80) 
       -some buttons 

我的問題是子視圖的底部鋪設結合的MainView的之外。子視圖的底部處的按鈕不響應。頂部的人是響應式的,因爲他們的位置也在Mainview中。

所以,當我嘗試點擊子視圖底部的按鈕,我實際上點擊MainWindow!子視圖的底部按鈕的位置不在MainView內部

有沒有辦法使我的所有子視圖都可用,即使它的一半超出了MainView的界限?

我知道我可以直接在MainWindow下創建子視圖,但我不想重做我的代碼。

更新 這裏是如何設計自己的看法: A =主窗口,B =的MainView,C =容器視圖,d =子視圖,X =在這裏我要點擊

+----------------------------+ 
|A       | 
|+-------------------------+ | 
||B      | | 
||   +----------+ | | 
|+------------|C&D  |-+ | 
|    |X   | | 
|    +----------+ | 
+----------------------------+ 

謝謝你

+0

[uiview界限之外的交互]的可能重複(https://stackoverflow.com/questions/5432995/interaction-beyond-bounds-of-uiview) –

回答

0

我不是100%確定我明白你在做什麼,但是如果子視圖是可見的但不在MainView中,那麼從子視圖獲取操作到MainView的唯一方法是在子視圖中接收它們並傳遞他們到MainView上。

如果這不是一個答案,我需要更多關於你想要完成的信息。

+0

如果您檢查子視圖(500,40)的座標,這個視圖的頂部在Mainview之上,底部在MainWindow之上。我的問題是當我點擊從子視圖底部的按鈕。根據我的理解,因爲subview屬於MainView,所以我無法訪問y軸80(MainView的高度)之後的部分。其實,當點擊子視圖的底部時,我點擊MainWindow。不要,如果它是更好的:/ – peterphonic

+0

是的,事實上,如果你設置父視圖剪輯子視圖,你甚至不會看到子視圖的那一部分。但是,你試圖完成的究竟是什麼? Jiri發佈的內容可能適用於您的案例,但您必須手動執行PITA的操作,並消除了使用「界面」構建器的好處。 可能是一種更簡單的方法來完成它是你之後。 – EricLeaf

+0

我想要做的是以下幾點:MainView有一個保存按鈕。當用戶點擊保存按鈕時,它實際上會打開子視圖(使用過渡動畫進行後期風格),子視圖中有關於保存的更多信息。當你點擊子視圖中的按鈕時,它將處理委託給MainView。也許更好的方法是使MainWindow的子視圖部分而不是?我不想這樣做,因爲我將不得不重新實施3班,我認爲我差不多完成了=)但是,那是發展中的生活! – peterphonic

13

您需要在MainView中實施hitTest:(CGPoint)point withEvent:(UIEvent *)event

See the documentation

點擺在接收器的邊界之外從不報告爲 命中,即使他們實際上在於接收器的子視圖中的一個內。 如果 父視圖的clipsToBounds屬性設置爲NO,則子視圖可以在視覺上超出其父項的範圍。然而,點擊 測試總是忽略父視圖邊界之外的點。

尋址評論:

你應該繼承的UIView。然後將nib中的MainView類設置爲您的UIView子類。

Some hittesting is discussed here,但我無法找到它如何工作的明確解釋。

Try this StackOverflow question

我沒有測試過,但下面的代碼可能會做你的需要:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    for(UIView *subview in self.subviews) 
    { 
     UIView *view = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event]; 
     if(view) return view; 
    } 
    return [super hitTest:point withEvent:event]; 
} 
+0

Thx爲您的答覆。我通過網絡快速瀏覽瞭解如何使用hitTest。沒有發現那麼多。我不知道該怎麼做。實際上,MainView是一個xib。我是否需要創建自己的類MainView繼承UIView並重新實現hitTest? 另一個問題,即使當我點擊MainView以外的地方也會打電話嗎? – peterphonic

+0

@peterphonic查看更新的答案 – Jiri

+0

好的,我找到了鏈接[link](http://stackoverflow.com/questions/4961386/event-handling-for-ios-how-hittestwithevent-and-pointinsidewithevent-are-re )據我所知,如果我在MainView中實現hittest,當我點擊子視圖的底部時,此方法將不會被調用... – peterphonic

0

我只是解決了這個自己。和你一樣,我的'B'視圖啓動了'C'視圖,'B'外的'C'部分不可用。

我的解決方案稍有不同,因爲在我的情況下,'C'完全在'B'之外,但是'B'(並且被'B'打開)。

就我而言,我只是將'C'附加到'A',並利用@property回調函數將'C'中的更改與'B'(通過'A')進行通信。

就你而言,另一種解決方案是簡單地擴展'B'的框架以包含'C' - 一旦'C'不再可見時,可以將其擴展回來。使'B'的背景清晰。

相關問題