簡體   English   中英

防止超級視圖識別平移手勢(在iOS 7中)

[英]Prevent the superview recognizing the pan gesture (in iOS 7)

我已經實現了一個側邊欄NavigationController ,它由一個前面的ViewController和一個后面的ViewController 此側邊欄NavigationController確實使用了平移和滑動gesture recognizers以使用戶在前視圖和后視圖之間切換。 工作正常。 但是在前面的ViewController使用TableView會導致令人討厭的行為。 每當我在表格視圖中滾動時,側邊欄NavigationControllers的平移手勢識別器都會識別手指的水平移動並相應地移動前視圖控制器。

現在,這是我的問題:當我在表格視圖中滾動時,是否可以防止超級視圖(側欄NavigationController's視圖)識別出搖動手勢? 它在某種程度上可以與導航控制器的向后滑動手勢一起使用,因為向后滑動(從左向右)時,我的側邊欄NavigationController無法識別平移手勢。 它也可以與前視圖中的UISlider完美配合。 因此,我可以從左向右移動滑塊的拇指,而我的側邊欄NavigationController根本無法識別平移手勢。 因此,滑塊會以某種方式阻止將觸摸事件轉發到其超級視圖。 如何在表格視圖中實現相同目的?

嘗試以下方法:

  • 設置手勢代表並防止同時識別2個手勢
  • 實現UIScreenEdgePanGestureRecognizer
  • 在手勢委托中,當狀態為UIGestureRecognizerStateBegan時,請檢查手勢的位置,並同時調用兩個gesture.enabled = NO; gesture.enabled = YES; gesture.enabled = NO; gesture.enabled = YES; 在位置位於表格視圖中的情況下中斷手勢識別。

不幸的是,每種方法都有副作用。

在我的早期項目之一中,我遇到了同樣的問題。

我最終在視圖控制器中覆蓋了shouldBeRequiredToFailByGestureRecognizer (UIGestureRecognizerDelegate函數),以防止其他視圖竊取我的手勢

//Prevents the map from stealing gestures from headerview
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    if(gestureRecognizer is your gesture)
        return YES;

    return NO;
}

請記住設置手勢識別器的代表!

我修改了在SideBarNavigationController中實現的手勢識別,現在可以實現所需的行為。

因此,我只需要更改脫位方法gestureRecognizer:的實現,就應該同時使用GestureRecognizer:來識別。 以前,它只是返回YES,以便SideBarNavigationController可以同時檢測滑動和平移手勢。 現在,實現更改為以下內容:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    BOOL shouldRecognize = NO;

    if (  (  (gestureRecognizer == _rightSwipeGestureRecognizer)
           ||(gestureRecognizer == _leftSwipeGestureRecognizer)
           ||(gestureRecognizer == _panGestureRecognizer))
        &&(  (otherGestureRecognizer == _rightSwipeGestureRecognizer)
           ||(otherGestureRecognizer == _leftSwipeGestureRecognizer)
           ||(otherGestureRecognizer == _panGestureRecognizer)))
    {
        shouldRecognize = YES;
    }

    return shouldRecognize;
}

現在,該方法檢查兩個給定的手勢識別器是否等於在我的SideBarNavigationController中創建的手勢識別器。 如果是這樣,則該方法返回“是”。 否則,如果一個手勢識別器來自另一個視圖(如表格視圖),則方法將返回NO,以便SideBarNavigationController停止檢測滑動手勢和平移手勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM