SWRevealViewController 在打开超过 'snappoint' 时关闭

SWRevealViewController closes when opened beyond 'snappoint'

我正在尝试让 SWRevealViewController 在我的应用程序中工作。

我所做的是我不想从屏幕上的任何位置打开菜单所以我将所有 UIPanGestureRecognizer 更改为 UIScreenEdgePanGestureRecognizer 所以它只会从屏幕的一侧。

为了实现这一点,我还更改了panGestureRecognizer 方法。现在看起来如下

- (UIScreenEdgePanGestureRecognizer*)panGestureRecognizer
{
    if ( _panGestureRecognizer == nil )
    {
        _panGestureRecognizer = [[SWRevealViewControllerPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)];
        _panGestureRecognizer.delegate = self;
        _panGestureRecognizer.edges = UIRectEdgeLeft;
        [_contentView.frontView addGestureRecognizer:_panGestureRecognizer];
    }
    return _panGestureRecognizer;
}

但是(不确定此更改是否会导致我的问题)当我开始从左侧打开菜单并将其展开到打开时通常会捕捉到的位置时,它会折叠回去。

假设它打开到屏幕的 500 像素。当我将它拖到超过 500px 时,它会自动关闭菜单。

另外目前还无法通过滑动再次关闭菜单。我现在所做的是添加一个手势识别器,它将触发 revealViewController.revealToggle(animated: true) 方法。

有没有人碰巧知道如何解决这个问题?

导入#import "SWRevealViewController.h"

这两个手势可以帮助您打开和关闭 sw 菜单。拖动点击打开关闭SW

[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
[self.view addGestureRecognizer:self.revealViewController.tapGestureRecognizer];

正常打开sw菜单

[self.revealViewController revealToggleAnimated:YES]

我最终使用 SWRevealViewController 附带的委托方法修复了它,我的整个代码如下所示

import UIKit
import SWRevealViewController
import UIKit.UIGestureRecognizerSubclass

class ViewController: UIViewController, SWRevealViewControllerDelegate {

    @IBOutlet var openMenu: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        openMenu.target = self.revealViewController()
        openMenu.action = #selector(SWRevealViewController.revealToggle(_:))

        revealViewController().delegate = self
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

        self.hideMenuWhenTappedAround()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func revealControllerPanGestureShouldBegin(_ revealController: SWRevealViewController!) -> Bool {
        let point = revealController.panGestureRecognizer().location(in: self.view)

        if revealController.frontViewPosition == FrontViewPosition.left && point.x < 50.0 {
            return true
        }
        else if revealController.frontViewPosition == FrontViewPosition.right {
            return true
        }

        return false
    }

    func revealController(_ revealController: SWRevealViewController!, panGestureMovedToLocation location: CGFloat, progress: CGFloat) {
        if location >= revealController.rearViewRevealWidth {
            revealController.panGestureRecognizer().state = UIGestureRecognizerState.ended
        }
    }
}

self.hideMenuWhentappedAround() 确保当您点击 uiview 上的任意位置时菜单将关闭。此方法是在 UIViewController 的扩展中创建的,如下所示。

import UIKit
import SWRevealViewController

extension UIViewController {
    func hideMenuWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(SWRevealViewController.dismissMenu))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    func dismissMenu() {
        self.revealViewController().revealToggle(animated: true)
    }
}