SWRevealViewController: Remove interaction on frontview when rearview is revealed

前端 未结 15 1239
迷失自我
迷失自我 2020-12-24 10:05

I need to disable user interaction on front view when rear view is revealed. Found some others asking the same thing but can\'t really understand where or how to implement t

相关标签:
15条回答
  • 2020-12-24 10:50

    In viewWillAppear method of your menu items controller, Just create an overlay button on the front view and set action to revealToggle: of revealViewController

    -(void)viewWillAppear:(BOOL)animated 
    {
        [super viewWillAppear:animated];
        overlayView = [UIButton buttonWithType:UIButtonTypeCustom];
        overlayView.frame = self.revealViewController.frontViewController.view.bounds;
        overlayView.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.8];
        overlayView.tag = 999;
        [overlayView addTarget:self.revealViewController action:@selector(revealToggle:) forControlEvents:UIControlEventTouchUpInside];
        [overlayView addTarget:self.revealViewController action:@selector(revealToggle:) forControlEvents:UIControlEventTouchDragOutside];
        [self.revealViewController.frontViewController.view addSubview:overlayView];
    }
    

    In revealTogglle method remove the overlay button if any:

    - (void)revealToggleAnimated:(BOOL)animated
    {
        UIButton *overlayView = (UIButton*)[self.view viewWithTag:999];
        if (overlayView) {
            [overlayView removeFromSuperview];
            overlayView = nil;
        }
        // rest of the code...
    }
    
    0 讨论(0)
  • 2020-12-24 10:50

    Consider following solution, works perfect

    private let DimmingViewTag = 10001
    
    extension UIViewController: SWRevealViewControllerDelegate {    
    
        func removeInteractionFromFrontViewController() {
    
            revealViewController().delegate = self
    
            view.addGestureRecognizer(revealViewController().panGestureRecognizer())
        }
    
        //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)
    
        removeInteractionFromFrontViewController()
    }
    
    0 讨论(0)
  • 2020-12-24 10:51

    Another way is to have an overlay view when the rear view is revealed. You can use this updated library https://github.com/NSRover/SWRevealViewController and make sure you include shouldUseFrontViewOverlay = true when the rear view is revealed.

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