SWRevealViewController与UISlider冲突

时间:2016-05-07 10:20:25

标签: swift uislider uipangesturerecognizer swrevealviewcontroller

我目前面临一个问题,试图在我的一个视图中委托SWRevealViewController panGestureRecognizer方法。

当我滑动我的UISlider时,panGesture干扰并打开侧面菜单而不是移动我的滑块。

我试图委托panGesture并且它运作良好,但是如果我退出我的观点去另一个,那么消化不再是功能了,我不能从我的第二个视图中显示我的侧面菜单。

我的代码:

class Search : UIViewController, UIGestureRecognizerDelegate{

@IBOutlet weak var sliderprice: UISlider!

 override func viewDidLoad() {
    super.viewDidLoad()
     self.revealViewController().panGestureRecognizer().delegate = self
  }

 override func viewDidAppear(animated: Bool) {
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
  }

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if (touch.view == self.sliderprice){
        return false
    }
    else{
        return true
    }
  }

}

1 个答案:

答案 0 :(得分:0)

虽然这是一个老问题,但无论如何我都会回答,也许对于那些来自Google搜索的人来说,这会有所帮助。

经过数小时的研究和思考,最终我能够为这个问题提出多种解决方案。

懒惰

这个解决方案不推荐,但是有效,所以我决定列出它。

在将self设置为self.revealViewController().panGestureRecognizer()代理人之前,请将原始self.revealViewController().panGestureRecognizer().delegate存储到某个媒体资源,当您离开屏幕viewWillDisappear()时,请设置{ {1}}返回您在self.revealViewController().panGestureRecognizer().delegate中存储的那个。所以最终它恢复了原来的委托。篡改像这样的代表从来没有真正推荐,但我说,它的确有效。

The Nicer One

我认为这仍然不是最佳解决方案,但我们正在实现这一目标。查找一个类,一个在整个应用程序中使用的控制器,并在启动应用程序时调用。这里将viewDidLoad()' s SWRevealViewController设置为此类,并适当地覆盖panGestureDelegate方法(见下文)。

最好的一个 - (在我看来)

现在这是最好,最明确的解决方案。 目前(2018年5月),SWRevealViewController的最后一次提交是在2015年。

分叉原始项目(https://github.com/John-Lluch/SWRevealViewController)或简单地复制两个必要文件(gestureRecognizerShouldBeginSWRevealViewController.m)并将它们放在一个单独的文件夹中以处理第三方库。然后,您可以从SWRevealViewController.h中删除SWRevealViewController。不要忘记修复您拥有它的Podfile的导入。

现在您可以自由修改文件了。我建议的是以下内容。 转到SWRevealViewController并实施以下方法:

SWRevealViewController.m

如果触摸的视图是-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return ![touch.view isKindOfClass:UISlider.class]; } (或继承自UISlider的自定义类),则手势将无法开始,这意味着平移手势将不再与UISlider的平移冲突手势。

我真的希望我可以帮助那里的任何人,因为这个问题在我的背后已经很长一段时间了。