SWRevealViewController close rear view when tapping front view

前端 未结 9 1589
夕颜
夕颜 2020-12-09 04:18

I am using SWRevealViewController in order to implement a side nav menu in my app. I would like to make it so that the front view cannot be interacted with when

相关标签:
9条回答
  • 2020-12-09 04:51

    I used the tapGestureRecognizer but there are still some problems. I tried this and worked great!

    Define class:

    @interface IgnoreView : UIView
    
    @property (nonatomic, assign) BOOL shouldAllTouchesBeForMe;
    
    @end
    

    Implement:

    @implementation IgnoreView
    
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        if( self.shouldAllTouchesBeForMe ){
            return self;
        }
        return [super hitTest:point withEvent:event];
    }
    
    @end
    

    Then make your View class in Interface Builder of class IgnoreView

    In your ViewController, then, do:

    in - viewDidLoad

    self.revealViewController.delegate = self;
    [self.view addGestureRecognizer:self.revealViewController.tapGestureRecognizer];
    

    the implement in your viewcontroller also:

    - (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position
    {
        IgnoreView *i = (id)self.view;
        i.shouldAllTouchesBeForMe = position == FrontViewPositionRight;
    }
    

    And you're all set!

    0 讨论(0)
  • 2020-12-09 05:01

    In ViewDidLoad of your frontViewController you need to add a UITapGestureRecognizer

    SWRevealViewController *revealController = [self revealViewController];
    UITapGestureRecognizer *tap = [revealController tapGestureRecognizer];
    tap.delegate = self;
    
    [myView addGestureRecognizer:tap];
    

    This should cause the rear view to close when the front view is tapped which is SWRevealViewController's default behaviour.

    0 讨论(0)
  • 2020-12-09 05:01

    Consider this simple solution, works perfect

    private let DimmingViewTag = 10001
    
    extension UIViewController: SWRevealViewControllerDelegate {    
    
        func setupMenuGestureRecognizer() {
    
            revealViewController().delegate = self
    
            view.addGestureRecognizer(revealViewController().panGestureRecognizer())
            view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
        }
    
        //MARK: - SWRevealViewControllerDelegate
    
        public func revealController(revealController: SWRevealViewController!, didMoveToPosition position: FrontViewPosition) {
    
            if case .Right = position {
    
                let dimmingView = UIView(frame: view.frame)
                dimmingView.tag = DimmingViewTag
    
                view.addSubview(dimmingView)
                view.bringSubviewToFront(dimmingView)
    
            } else {
                view.viewWithTag(DimmingViewTag)?.removeFromSuperview()
            }
        }
    }
    

    Simple usage in UIViewController:

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    
        setupMenuGestureRecognizer()
    }
    
    0 讨论(0)
  • 2020-12-09 05:07

    EDIT: Change UIView's autoresizingMask to suit Swift 2, thanks to Marroc's comment

    This is Swift-SWRevealViewController 2.x version of @avdyushin's answer:

    func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {
        let tagId = 4207868622
    
        if revealController.frontViewPosition == FrontViewPosition.Right {
            let lock = self.view.viewWithTag(tagId)
            UIView.animateWithDuration(0.25, animations: {
                    lock?.alpha = 0
                }, completion: {(finished: Bool) in
                    lock?.removeFromSuperview()
                }
            )
            lock?.removeFromSuperview()
        } else if revealController.frontViewPosition == FrontViewPosition.Left {
            let lock = UIView(frame: self.view.bounds)
            lock.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
            lock.tag = tagId
            lock.alpha = 0
            lock.backgroundColor = UIColor.blackColor()
            lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: "revealToggle:"))
            self.view.addSubview(lock)
            UIView.animateWithDuration(0.75, animations: {
                    lock.alpha = 0.333
                }
            )
        }
    }
    
    0 讨论(0)
  • 2020-12-09 05:10

    If you are using SWIFT, you can do something like this, in your frontViewController:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if self.revealViewController() != nil {
    
            self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
            self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
        }
    
    }
    

    Code works for TAP and PAN gesture.

    0 讨论(0)
  • 2020-12-09 05:11

    Thanks to mixth & avdyushin for there mighty help. Here's the Swift 4 version derived from there answer to save your couple of hours:

    extension UIViewController: SWRevealViewControllerDelegate {
    
    func setupMenuGestureRecognizer() {
    
        revealViewController().delegate = self
    
        view.addGestureRecognizer(revealViewController().panGestureRecognizer())
        view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
    }
    
    //MARK: - SWRevealViewControllerDelegate
    public func revealController(_ revealController: SWRevealViewController!, willMoveTo position: FrontViewPosition) {
        let tagId = 112151
        print("revealController delegate called")
        if revealController.frontViewPosition == FrontViewPosition.right {
            let lock = self.view.viewWithTag(tagId)
            UIView.animate(withDuration: 0.25, animations: {
                lock?.alpha = 0
            }, completion: {(finished: Bool) in
                lock?.removeFromSuperview()
            }
            )
            lock?.removeFromSuperview()
        } else if revealController.frontViewPosition == FrontViewPosition.left {
            let lock = UIView(frame: self.view.bounds)
            lock.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            lock.tag = tagId
            lock.alpha = 0
            lock.backgroundColor = UIColor.black
            lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: #selector(SWRevealViewController.revealToggle(_:))))
            self.view.addSubview(lock)
            UIView.animate(withDuration: 0.75, animations: {
                lock.alpha = 0.333
            }
            )
        }
    }
    
    }
    

    Now call this function setupMenuGestureRecognizer from viewDidLoad of your rear view controller.

    Or you can also implement SWRevealViewControllerDelegate directly to your rear view controller class and use the SWRevealViewControllerDelegate function in the class itself.

    0 讨论(0)
提交回复
热议问题