2014-06-24 305 views
4

iOS5,我使用UIViewController遏制遍佈一個應用程序,我已經在幾個地方實現了UITouchGestureiOS視圖控制器遏制|子視圖控制器通過觸動父視圖控制器

當我添加一個孩子ViewController(全屏幕)時,觸摸會傳遞給它的父項。

什麼,如果有的話,解決這個問題。我使用MPFlipViewController,當用戶將他們的手指移過兒童ViewController時,我可以看到兒童下方的頁面翻轉。

爲了澄清,我加我的ViewController作爲一個孩子有以下:

[self addChildViewController:vc]; 
[vc willMoveToParentViewController:nil]; 
[self.container addSubview:vc.view]; 
[vc didMoveToParentViewController:self]; 

容器僅僅只是一個UIView的childViewController &其他的UIView對象視圖坐。 謝謝

回答

6

你已經得到它了。控制器遏制是一回事,但這只是標準的視圖層次結構和響應者鏈條。所以觸摸最初發送給父母;特別是打電話給它的觀點-(UIView *)hitTest:withEvent:。如果可以找到,則返回子視圖。否則,它將返回其自己的一個視圖。可能它自己回來。

如果父控制器正在捕獲觸摸,意味着它從未被髮送給孩子。並不是說它被髮送給孩子,然後上升到父母。

如果您希望父母通過觸摸捕捉執行某些不常見的操作,那麼只需使用自定義視圖並實施您自己的-hitTest:withEvent:。作爲第一步,做到這一點,只需記錄輸入,看看會發生什麼。

+0

我修改了我的問題,它不是標準查看Hierachy的東西,因爲我將ViewController添加爲childViewController,它仍然將它們的觸摸傳遞給它從其下降的父對象上的UIView對象:)。 – theiOSDude

+1

除非您手動向該方向傳遞觸摸,否則UIKit的工作方式並非如此。在觸摸下方查找最本地視圖的搜索從最上面的視圖向下。所以從父母到孩子。反之亦然。控制器遏制增加了普通視圖管理,它不會改變基本原理。您如何看待觸摸下方的視圖? – Tommy

1

在iOS 7發佈之前這是難以置信的,我想知道現在任何專家都會完成這件事。

+0

那麼,我該怎麼做iOS7來阻止呢? Thnx – theiOSDude

1

您應該爲子視圖控制器實現觸摸處理。允許孩子捕捉所有觸摸事件,然後放下它們,以便它們不會傳遞給父級。

另一個解決方案可能是將您的子視圖控制器包裝在UINavigationController中,這可能會免費獲得您的行爲。

從父視圖控制器發佈代碼UITouchGesture可能會有所幫助。

1

MPFlipViewController.m你應該看看這個方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

改變它像

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    if (otherGestureRecognizer == GestureRecognizerOfYourChildViewController) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

其中當然GestureRecognizerOfYourChildViewController是你的孩子視圖控制器的手勢識別。

編輯:由於OP沒有在自己的子視圖控制器上使用手勢識別器,所以解決方案有點不同。我會在這裏留下第一個版本,因爲它可能對其他類似問題有幫助。

我能想到的這裏最好的解決辦法是,你需要在MPFlipViewController禁用gestureRecognizers時有顯示在其子視圖控制器,且在兒童視圖控制器被刪除,MPFlipViewController在頂部再次重新啓用它們。使用enabled屬性。

手勢識別器可以在您自己的視圖控制器中使用的「觸摸鏈」之外工作,這就是您的問題發生的原因。

+0

謝謝,我稍微修改了我的問題,我沒有在ChildViewController上使用手勢識別器,用戶只是將他們的手指放在子視圖中的屏幕上,並且父級上的MPFlipViewController正在吸收觸摸並移動「 ' – theiOSDude

+0

我更新了答案。但是,子視圖控制器是否會對接收到的觸摸做出反應? – johnyu

相關問題