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
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!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
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];
}
}
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()
}
}
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.
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...
}
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.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.
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.
}
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
}
}
}
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()
}
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];
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];
}
}
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;
}];
}
}
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
}
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