如何选择合适的 UIGestureRecognizer? [英] How to choose the right UIGestureRecognizer?

查看:22
本文介绍了如何选择合适的 UIGestureRecognizer?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有视图控制器,里面有 UIPageViewController.

I have view controller which as UIPageViewController inside.

使用 pageviewcontroller 我可以向左、向右滑动以转到其他 VC.有用!

Using pageviewcontroller I can swipt left, right in order to go to other VCs. It works!

所以,在我添加 sideBarMenu 之后.添加此菜单时,我使用此代码添加手势识别器:

So, after I added sideBarMenu. When adding this menu I use this code to add gesture recognizer:

 var menuViewController: UIViewController! {
    didSet {
        self.exitPanGesture = UIPanGestureRecognizer()
        self.exitPanGesture.addTarget(self, action:"handleOffstagePan:")
        self.sourceViewController.view.addGestureRecognizer(self.exitPanGesture)

    }

这里的 sourceViewController 是我原来的 VC.

Here the sourceViewController is my original VC.

问题是当我尝试滑动(为了关闭菜单)时,pageViewController 滑动有效.

The problem is when I try to swipe (in order to close menu), the pageViewController swipe works.

我想在打开菜单时禁用 pageViewController 滑动并启用新的滑动功能.并在菜单关闭时进行相反的操作.

I want to disable pageViewController swipe and enable new swipe function when menu is opened. And do oppositely when menu is closed.

附加代码:

 func handleOffstagePan(pan: UIPanGestureRecognizer){
    println("dismiss pan gesture recognizer")

    let translation = pan.translationInView(pan.view!)

    let d = translation.x / CGRectGetWidth(pan.view!.bounds) * -0.5

    switch (pan.state) {

    case UIGestureRecognizerState.Began:
        self.interactive = true

        self.menuViewController.performSegueWithIdentifier("dismisMenu", sender: self)

        break
    case UIGestureRecognizerState.Changed:
        self.updateInteractiveTransition(d)
        break
    default:
        self.interactive = false

        if d > 0.1 {

            self.finishInteractiveTransition()
        }else {

            isMenuVisible = false
            self.cancelInteractiveTransition()
        }
    }

}

推荐答案

伙计们!所以,解决方案不是将 PageViewController 设置为 TransitionManager 的 sourceVC,而是将 pageContentViewController 设置为 sourceVC.PageContentViewControler 是:

Guys! SO, the solution is instead of setting PageViewController to the sourceVC of your TransitionManager, set pageContentViewController to the sourceVC. PageContentViewControler is :

 func resetToMainPage(index: Int!) {
    /* Getting the page View controller */
    mainPageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageViewController") as UIPageViewController
    self.mainPageViewController.dataSource = self
    self.mainPageViewController.delegate = self

    let pageContentViewController = self.viewControllerAtIndex(index)

    self.transtionManger.sourceViewController = pageContentViewController // adding swipe to the pageContentViewControlle in order to close menu

    self.mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)


    self.mainPageViewController.view.frame = CGRectMake(0, 102, self.view.frame.width, self.view.frame.height)
    self.addChildViewController(mainPageViewController)
    self.view.addSubview(mainPageViewController.view)
    self.mainPageViewController.didMoveToParentViewController(self)

}

这里我把pageContentVC设置为transitionManageClass的sourveVS.接下来是如何选择合适的 GestureRecognizer.默认情况下,当您添加新的手势识别器时,旧的识别器不起作用.当您禁用新的手势识别器时,旧的手势识别器开始工作!我使用代码添加了新的手势识别器:

Here I set pageContentVC to the sourveVS of transitionManageClass. NExt how to choose the right GestureRecognizer. By default when you add new gesture recognizer the old one doesnt work. When you disable the new gesture recognizer the old one starts to work! I added new gesture recognizer using code:

var menuViewController: UIViewController! {
    didSet {
        self.exitPanGesture = UIPanGestureRecognizer()
        self.exitPanGesture.addTarget(self, action:"handleOffstagePan:")
      //  self.exitPanGesture.view?.userInteractionEnabled = false
        self.sourceViewController.view.addGestureRecognizer(self.exitPanGesture)

    }
}

在设置 menuViewController 之前,我设置了 sourceViewController.所以,在这里我将新的手势识别器添加到我的 sourceViewController.接下来,步骤是禁用此手势识别.当您关闭菜单时,使用以下代码禁用它:

Before setting menuViewController I set sourceViewController. So, here I am adding new gesture recognizer to my sourceViewController. Next, step is to disable this gesture recognize. When you close the menu disable it using this code:

 var presentingP:Bool!{
    didSet{
        if presentingP == true {
            // enable the gesture recognizer only when the view of menucontroller is presented

            self.exitPanGesture.view?.userInteractionEnabled = true
        }else{
            // disable gesture recognizer when menu is not presented
            self.exitPanGesture.view?.userInteractionEnabled = false
            isMenuVisible = false
        }
    }
}

PresentingP 是布尔值,显示菜单何时打开和关闭!

PresentingP is boolean value which shows when menu is opened and closed!

这篇关于如何选择合适的 UIGestureRecognizer?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆