我目前面临一个问题,试图在我的一个视图中委托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
}
}
}
答案 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)或简单地复制两个必要文件(gestureRecognizerShouldBegin
和SWRevealViewController.m
)并将它们放在一个单独的文件夹中以处理第三方库。然后,您可以从SWRevealViewController.h
中删除SWRevealViewController
。不要忘记修复您拥有它的Podfile
的导入。
现在您可以自由修改文件了。我建议的是以下内容。
转到SWRevealViewController
并实施以下方法:
SWRevealViewController.m
如果触摸的视图是-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
return ![touch.view isKindOfClass:UISlider.class];
}
(或继承自UISlider的自定义类),则手势将无法开始,这意味着平移手势将不再与UISlider的平移冲突手势。
我真的希望我可以帮助那里的任何人,因为这个问题在我的背后已经很长一段时间了。