web-dev-qa-db-fra.com

Ajout de la reconnaissance de geste par balayage à DetailViewController

Je viens de réaliser un projet xcode simple à partir du modèle "Master-Detail Application", pour iPad. Lorsque l'appareil est en orientation Portrait, la vue principale est masquée et lorsque vous effectuez un balayage droit dans la vue détaillée, la vue principale s'affiche. Maintenant, je veux ajouter un identificateur de geste de balayage droit à la vue détaillée, comme ceci:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];

    UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandler)];
    [self.view addGestureRecognizer:gestureRecognizer];
}

-(void)swipeHandler{
    NSLog(@"SWIPE");
}

Mais ce code provoque que lorsque je glisse sur la vue détaillée, le journal "SWIPE" apparaît dans la console, mais la vue principale ne s'affiche pas.

Comment ajouter un identificateur de geste de balayage droit à la vue détaillée afin d'éviter que la vue principale ne s'affiche et que mon gestionnaire de reconnaissance fonctionne?

Merci d'avance.

MODIFIER. Je veux que mon gestionnaire de reconnaissance de balayage droit fonctionne simultanément avec celui-ci, qui affiche la vue principale, mais le code suivant n'est pas une solution pour cette situation spécifique:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

    return YES;
}
22
darko_5

vous devez définir la direction du balayage afin d'ajouter le bon balayage 

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandler:)];
    [gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [self.view addGestureRecognizer:gestureRecognizer];

et votre gestionnaire de balayage pourrait ressembler à 

-(void)swipeHandler:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}
38
nsgulliver
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRecognizer:)];
    recognizer.direction = UISwipeGestureRecognizerDirectionRight;
    recognizer.delegate = self;
    [self.view addGestureRecognizer:recognizer];
}

- (void)swipeRecognizer:(UISwipeGestureRecognizer *)sender {
    if (sender.direction == UISwipeGestureRecognizerDirectionRight){
        [UIView animateWithDuration:0.3 animations:^{
            CGPoint Position = CGPointMake(self.view.frame.Origin.x + 100.0, self.view.frame.Origin.y);
            self.view.frame = CGRectMake(Position.x , Position.y , self.view.frame.size.width, self.view.frame.size.height);
            [self.navigationController popViewControllerAnimated:YES];
        }];
    }
}
17
Jagat Dave

Essaye ça 

// balayage droit

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandlerRight:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:gestureRecognizer];

// balayage gauche

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandlerLeft:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:gestureRecognizer];

méthode d'appel

-(void)swipeHandlerRight:(id)sender
{
    //Your ViewController
}

-(void)swipeHandlerLeft:(id)sender
{
 //Your ViewController
}
9
Nilesh Parmar

Cela marche. Il pousse le contrôleur de vue à partir du navigateurContrôleur. 

- (void)viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer           alloc] initWithTarget:self  action:@selector(swipeHandler:)];
     [self.view addGestureRecognizer:gestureRecognizer];
}

-(IBAction)swipeHandler:(UISwipeGestureRecognizer *)sender
{
      NSLog(@"SWIPE");
      UIViewController *tb = [[DetailViewController alloc] init];
      tb = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
      [self.navigationController pushViewController: tb animated:YES];
}

Assurez-vous ensuite d'aller dans le storyboard (ou vous pouvez également le faire manuellement) - cliquez sur le contrôleur de vue de détail et donnez au contrôleur de vue l'identité: DetailViewController

0
user1066524

Swift 4.0

Étape 1: Ajoutez un ou plusieurs gestes de balayage dans la méthode viewDidLoad ().

override func viewDidLoad() {
    super.viewDidLoad()

    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
    swipeLeft.direction = .left
    self.view.addGestureRecognizer(swipeLeft)

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
    swipeRight.direction = .right
    self.view.addGestureRecognizer(swipeRight)


}

Étape 2: Vérifiez la détection de geste dans la méthode handleGesture ()

@objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
    if gesture.direction == UISwipeGestureRecognizerDirection.right {
        print("Swipe Right")
    }
    else if gesture.direction == UISwipeGestureRecognizerDirection.left {
        print("Swipe Left")
    }

}
0
Mehsam Saeed