SWRevealViewController: Usuń interakcję w widoku z przodu, gdy zostanie ujawniony Widok Z Tyłu

Muszę wyłączyć interakcję z użytkownikiem na widoku z przodu, gdy Widok Z Tyłu zostanie ujawniony. Znalazłem kilka innych pytających o to samo, ale nie bardzo rozumiem, gdzie i jak zaimplementować kod, który widziałem.

Ex: znalazłem ten kod z link,

- (void)revealController:(SWRevealViewController *)revealController 
      willMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

- (void)revealController:(SWRevealViewController *)revealController 
       didMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

Znalazłem też kilka innych linków

Mam ten kod, ale nie jestem pewien, gdzie go wstawić kod. Próbowałem dodać go w moich widokach z przodu/z tyłu, a także w metodzie SWRevealViewController bez powodzenia

Będę wdzięczny, jeśli ktoś wskaże mi właściwy kierunek.
Author: Community, 2014-03-24

15 answers

Ostatnio wymyśliłem rozwiązanie, którym chciałem się podzielić (przepraszam, jeśli spóźnia się o 2 miesiące).

Aby wyłączyć interakcję z użytkownikiem w widoku z przodu, gdy menu jest otwarte, dodałem następujące kody w moim MenuViewController :

On viewWillAppear :

[self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];

I na viewWillDisappear :

[self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];

Spowoduje to wyłączenie wszystkich interakcji użytkownika na kontrolerze widoku z przodu, co oznacza, że gesty przesuwania / stukania w celu zamknięcia menu będą również być wyłączony.

Teraz stworzyłem ParentViewController i zrobiłem z niego podklasę wszystkich kontrolerów widoku (elementów menu).

Na moim viewDidLoad umieszczam następujące kody:

SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];

Jeśli w tym momencie uruchomisz aplikację, pojawi się, że gest stukania działa (stuknięcie w widoku z przodu spowoduje zamknięcie Menu), ale nie gest przesuwania. Nie jestem pewien, dlaczego tak jest, ale aby włączyć Gest slajdów, aby zamknąć menu, dodaj następujące kod w twoim MenuViewController :

On viewWillAppear :

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

Podsumowując, oto czego potrzebujesz:

On your MenuViewController :

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
    [self.revealViewController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
}

I na kontrolerze widoku pozycji menu (możesz utworzyć ParentViewController dla wszystkich z nich):

-(void)viewDidLoad {
    [super viewDidLoad];

    SWRevealViewController *revealController = [self revealViewController];
    [revealController panGestureRecognizer];
    [revealController tapGestureRecognizer];
}
Mam nadzieję, że to pomoże!
 51
Author: aj_f,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 04:04:24

Użyłem innego podejścia, aby osiągnąć ten sam wynik, Nie wiem, czy to pomaga.

Przypisanie SWRevealViewControllerDelegate do AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    SWRevealViewController* reveal = (SWRevealViewController*)self.window.rootViewController;
    reveal.delegate = self;

    // other bootstrapping code
}

A następnie w metodzie delegate -(void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position Jak poniżej:

-(void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position
{
    if(position == FrontViewPositionLeft){
        [revealController.frontViewController.view setUserInteractionEnabled:YES];
        [revealController.frontViewController.revealViewController tapGestureRecognizer];
    }else{
        [revealController.frontViewController.view setUserInteractionEnabled:NO];
    }
}

Zaktualizowano : dodano tę linię [revealController.frontViewController.revealViewController tapGestureRecognizer], aby zamknąć ujawniony kontroler po dotknięciu frontviewcontroller

 11
Author: xun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-23 03:51:50

1992: Hey Guys jako John: Chociaż te rozwiązania działają, nie sądzę, aby żadne z nich odpowiadało na oryginalne pytanie, które jest w rzeczywistości dość proste: {]}

Są 2 kroki:

1) Dodaj następujące metody do kontrolera FrontViewController.m:

- (void)revealController:(SWRevealViewController *)revealController 
      willMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

- (void)revealController:(SWRevealViewController *)revealController 
       didMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

2) spraw, aby twój kontroler widoku z przodu był delegatem SWRevealViewController w kontrolerze widoku z przodu.plik h:

(np. @ interface HomeViewController : UIViewController ) gdzie był mój FrontViewController nazwa HomeViewController

A także w kontrolerze FrontViewController.m Plik z następującym w ViewDidLoad:

Siebie.revealViewController.delegat = self; Problem rozwiązany! Znacznie łatwiejsze niż tworzenie klas nadrzędnych itp.

To pomoże Ci rozwiązać interakcje użytkowników dla kontrolera FrontView lovely dodałbym tylko następującą zmianę zaczerpniętą z odpowiedzi Xuna również powyżej i rozwiążesz zarówno interakcje użytkowników, jak i menu Ukryj po dotknięciu użytkownika FrontViewController.

- (void)revealController:(SWRevealViewController *)revealController 
      willMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

- (void)revealController:(SWRevealViewController *)revealController 
       didMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
      //Hides the menu when user taps FrontViewController
       [revealController.frontViewController.revealViewController tapGestureRecognizer];
    } 
}
 3
Author: Pablo Segura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 01:49:28

Wersja Swift do @ hardluckbaby odpowiedź:

In MenuViewController(kontroler widoku z tyłu):

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    self.revealViewController().frontViewController.view.userInteractionEnabled = false
    self.revealViewController().view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    self.revealViewController().frontViewController.view.userInteractionEnabled = true
}

W FrontViewController (możesz utworzyć ParentViewController dla wszystkich kontrolerów widoku z przodu, jak powiedział @ hardluckbaby):

override func viewDidLoad() {
    super.viewDidLoad()

    if let revealController = self.revealViewController() {
        revealController.panGestureRecognizer()
        revealController.tapGestureRecognizer()
    }
}
 2
Author: Ashok Kumar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 11:45:53

Dodaj subview do widoku z przodu, gdy Widok Z Tyłu jest otwarty.

 1
Author: Mayank Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 05:13:33

W metodzie viewWillAppear kontrolera pozycji menu, po prostu utwórz przycisk nakładki na widoku z przodu i ustaw akcję na 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];
}

W metodzie revealTogglle Usuń przycisk nakładki, jeśli istnieje:

- (void)revealToggleAnimated:(BOOL)animated
{
    UIButton *overlayView = (UIButton*)[self.view viewWithTag:999];
    if (overlayView) {
        [overlayView removeFromSuperview];
        overlayView = nil;
    }
    // rest of the code...
}
 1
Author: Amita_S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 20:32:53

Chociaż te rozwiązania działają, nie sądzę, aby żadne z nich odpowiadało na pierwotne pytanie, które jest w rzeczywistości dość proste: {]}

Istnieją 2 kroki:

1) Dodaj następujące metody do kontrolera FrontViewController.m:

- (void)revealController:(SWRevealViewController *)revealController 
      willMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

- (void)revealController:(SWRevealViewController *)revealController 
       didMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

2) spraw, aby twój kontroler widoku z przodu był delegatem SWRevealViewController w FrontViewController.h Plik:

(e.g. @interface HomeViewController : UIViewController <SWRevealViewControllerDelegate>)

Gdzie mój FrontViewController został nazwany HomeViewController

A także w FrontViewController.m plik o następującej treści na ViewDidLoad:

self.revealViewController.delegate = self;
Problem rozwiązany! Znacznie łatwiejsze niż tworzenie klas nadrzędnych itp.
 1
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 02:10:34

Innym sposobem jest widok nakładki, gdy Widok Z Tyłu jest odsłonięty. Możesz użyć tej zaktualizowanej biblioteki https://github.com/NSRover/SWRevealViewController i upewnij się, że dodałeś shouldUseFrontViewOverlay = true, gdy Widok Z Tyłu jest widoczny.

 1
Author: thedansaps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-15 06:00:54
On MenuTableViewController/ Rear VC, add SWRevealViewControllerDelegate.

    override func viewDidLoad() {
        super.viewDidLoad()
        self.revealViewController().delegate = self

        if self.revealViewController() != nil {
            self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        }
    }

Add this delegate method.

func revealController(revealController: SWRevealViewController!, didMoveToPosition position: FrontViewPosition) {
        if(position.rawValue == 4)
        {
            //move to rear
            self.revealViewController().frontViewController.view.userInteractionEnabled =  false
        }
        else if (position.rawValue == 3)
        {
            //move to front - dashboard VC
            self.revealViewController().frontViewController.view.userInteractionEnabled =  true
        }
    }
    func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {

//will perform the same function as the above delegate method.
    }
 0
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 13:51:46
class SideMenuViewController: UITableViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    self.revealViewController().delegate = self
  }

}

extension SideMenuViewController: SWRevealViewControllerDelegate {

  func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {
    if position == .Left {
      revealController.frontViewController.view.userInteractionEnabled = true
    }

    if position == .Right {
      revealController.frontViewController.view.userInteractionEnabled = false
    }
  }

}
 0
Author: Bryan Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 16:31:41

Rozważ następujące rozwiązanie, działa idealnie

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()
        }
    }
}

Proste użycie w UIViewController:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    removeInteractionFromFrontViewController()
}
 0
Author: Bartłomiej Semańczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 07:45:03

Dodatek do hardluckbaby odpowiedz

Jeśli uruchomisz aplikację w tym momencie, pojawi się, że dotknięcie Gest działa (dotknięcie widoku z przodu zamknie Menu), ale nie gest patelni. Nie jestem pewien dlaczego tak jest, ale aby umożliwić Gest slajdów aby zamknąć menu, Dodaj następujący kod w swoim MenuViewController:

On viewWillAppear:

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

Dodaje pewne niepożądane zachowanie, np. gest pan zamknie Widok Z Tyłu kiedy zaczyna się na nim.

Domyślny gest pan może nie działać, jeśli dodasz go gdzieś do własnego widoku, coś takiego jak na viewDidLoad Twojego kontrolera widoku z przodu:

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

Usuń takie linie i powinno to działać zgodnie z oczekiwaniami, dla gestów przesuwania i stukania

SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];
 0
Author: art-of-dreams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-27 14:18:11

Używałem funkcji viewWillAppear i viewwilldisappear, ale ponieważ mam podglądy prawie każdego elementu w menu bocznym, które miałem. Mój problem polegał na tym, że miałem aktywne pole wejściowe (wyświetlanie klawiatury) i uzyskałem dostęp do bocznego menu. W głównym menu klawiatura ukryła się, ale po wpisaniu podmenu klawiatura pojawiła się ponownie. Aby to rozwiązać, zmieniłem podejście, aby włączyć i wyłączyć interakcję w revealController tak:

- (void)revealController:(SWRevealViewController *)revealController 
        didMoveToPosition:(FrontViewPosition)position {
    if (position == FrontViewPositionRight) {
        [self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
    } else if (position == FrontViewPositionLeft) {
        [self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
    }
}
 0
Author: mxmlc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 12:17:00

Najpierw ustaw swojego delegata : siebie.revealViewController.delegat = self; a metoda delegata podana jest poniżej:

- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position
{
    static NSInteger tagLockView = 123456789;
    if (revealController.frontViewPosition == FrontViewPositionRight)
    {
        UIView *lockView = [self.view viewWithTag:tagLockView];

        [UIView animateWithDuration:0.3 animations:^{
            lockView.alpha = 0;
        } completion:^(BOOL finished) {
            [lockView removeFromSuperview];
        }];
    }
    else if (revealController.frontViewPosition == FrontViewPositionLeft)
    {
        UIView *lockView = [[UIView alloc] initWithFrame:self.view.bounds];
        lockView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        lockView.tag = tagLockView;
        lockView.backgroundColor = [UIColor blackColor];
        lockView.alpha = 0;
        [lockView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.revealViewController action:@selector(revealToggle:)]];
        [self.view addSubview:lockView];
        [UIView animateWithDuration:0.3 animations:^{
            lockView.alpha = 0.5;
        }];
    }

}
 0
Author: Priti Kanauziya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 10:12:00

Swift 3.0 prosta i szybka metoda.

Frontviewcontoller code tutaj...

override func viewDidLoad() {
    super.viewDidLoad()
     if self.revealViewController() != nil {
        let rewel:SWRevealViewController  = revealViewController()
        rewel.panGestureRecognizer()
        rewel.tapGestureRecognizer() 
    }
}

Tutaj znajdziesz kod do pobrania...

override func viewWillAppear(_ animated: Bool) {
  let rewel = self.revealViewController()
      rewel?.frontViewController.view.isUserInteractionEnabled = false
    rewel?.frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}

override func viewWillDisappear(_ animated: Bool) {
    let rewel = self.revealViewController()
        rewel?.frontViewController.view.isUserInteractionEnabled = true
}
 0
Author: Rex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-27 10:30:36