双语言App中SWRevealViewController segue切换及手势冲突问题
解决方案:单Segue实现双语环境下的动态左右菜单切换
嘿,这个问题我之前做RTL双语iOS应用的时候也碰到过,完全可以只保留一个segue来搞定,不用同时维护两个segue导致手势冲突的问题~
核心思路
问题的根源是你同时给SWRevealViewController设置了左侧(sw_rear)和右侧(sw_right)两个菜单控制器,所以手势会同时触发两者。我们只需要根据当前语言,给SWRevealViewController只设置一个方向的菜单控制器,就能解决冲突。
具体步骤
清理Storyboard,保留单个Segue
先删掉多余的那个segue,只保留主ViewController到菜单ViewController的一个segue,给它设置一个自定义的标识符(比如menuSegue),别用SWRevealViewController默认的sw_rear或sw_right。动态配置菜单方向
在主ViewController的代码里,根据当前语言直接给SWRevealViewController设置对应的菜单控制器,同时配置按钮和手势:override func viewDidLoad() { super.viewDidLoad() guard let revealVC = revealViewController() else { return } // 从Storyboard实例化菜单ViewController(替换成你的菜单VC类名) let menuVC = storyboard?.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController let currentLang = Locale.current.languageCode if currentLang == "he" { // 希伯来语环境:设置为右侧菜单 revealVC.rightViewController = menuVC // 按钮绑定右侧切换动作 menuButton.target = revealVC menuButton.action = #selector(SWRevealViewController.rightRevealToggle(_:)) } else { // 英文环境:设置为左侧菜单 revealVC.rearViewController = menuVC // 按钮绑定左侧切换动作 menuButton.target = revealVC menuButton.action = #selector(SWRevealViewController.revealToggle(_:)) } // 添加手势识别器,此时只会触发已设置的那个方向的菜单 view.addGestureRecognizer(revealVC.panGestureRecognizer()) }
额外说明
- 如果你的菜单VC需要通过segue传参,也可以先执行segue获取实例,再赋值给
revealVC的对应属性(比如在prepare(for:sender:)里保存菜单VC实例,再在viewDidLoad里设置)。 - 如果支持应用内切换语言,记得在语言切换后重新设置
revealVC的菜单控制器并刷新界面。
这样处理后,手势就只会触发当前语言对应的那个菜单,不会再出现同时弹出左右菜单的问题啦~
内容的提问来源于stack exchange,提问作者Sophie Bernard
相关产品推荐
相关产品推荐

