Partage de technologie

iOS UITableView est livré avec des gestes coulissants et la vue parent ajoute une exploration du mécanisme de réponse aux conflits par geste coulissant

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Scènes

Parfois, nous rencontrons un tel scénario interactif : nous avons un UITableView
Placez-le dans une fenêtre pop-up. Cette fenêtre pop-up peut être affichée et disparue en glissant (en glissant avec votre main). Ensuite, ce UITableView est placé dans la fenêtre pop-up et peut faire défiler pour afficher du contenu, tel que. informations sur le produit et commentaires (similaires à la fenêtre contextuelle des commentaires de Douyin), et lorsque vous glissez vers le bas, si tableView a glissé vers le haut, vous pouvez répondre au geste de glissement et continuer à faire glisser la fenêtre contextuelle vers le bas.

Idées

Tout d'abord, nous avons une tableView dans la vue pop-up. Cette tableView peut glisser normalement. Ensuite, nous ajoutons un geste de glissement à la vue pop-up. Dans la méthode de réponse du geste, nous modifions le cadre de la pop-up. fenêtre.Par conséquent, cette vue contextuelle est un proxy qui répond aux gestes
carré et dans

  • (BOOL)gestureRecognizer : (UIGestureRecognizer *)gestureRecognizer devrait reconnaître simultanément avec le gesteRecognizer : (UIGestureRecognizer *)autre gesteRecognizer
    Dans la méthode proxy, si gesteRecognizer est son propre geste de glissement et otherGestureRecognizer est le geste de glissement de tableView, il doit prendre en charge la réponse simultanée, c'est-à-dire renvoyer OUI. En même temps, nous devons avoir une idée, c'est-à-dire si. notre
    Lorsque le tableView défile vers le haut, vous devez définir le geste de défilement du tablView pour ne pas prendre en charge la réponse. Sinon, le tableView continuera à défiler vers le haut. Si vous faites glisser le tableView d'avant en arrière à ce moment-là, il le fera. provoquer des pop-ups et tableView Dans le cas d'un défilement simultané, c'est quelque chose que nous ne voulons pas, donc lorsque notre tablView défile vers le haut, nous devons définir le pangesture.enabled = NO de tableView.

Mécanisme de réponse de défilement à double balayage

Nous ajoutons un geste de glissement à la fenêtre contextuelle et la méthode de réponse est handlePan :
Grâce à des tests, nous avons constaté queLorsque notre main défile sur la tableView, à chaque fois que nous exécutons
Avant la méthode proxy scrollViewDidScroll de tableView, la méthode handlePan sera exécutée.

Veuillez ajouter une description de l'image

De plus, lors d'un swipe (le même swipe est compté si la main ne quitte pas l'écran),
S'il a été défini dans la méthode de réponse handlePan
self.tableView.panGestureRecognizer.enabled = NON provoquera
self.tableView ne défilera pas pendant cette diapositive, même si self.tableView.panGestureRecognizer.enabled = YES est défini après self.tableView.panGestureRecognizer.enabled = NO, il ne défilera pas.

Cela montre que ** En réponse à un geste coulissant, self.tableView.panGestureRecognizer.enabled = NO a la priorité la plus élevée.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"哈哈哈哈哈这里是执行scrollViewDidScroll self.panNum是%ld", self.panNum);
}

  • 1
  • 2
  • 3
  • 4
  • 5
- (void)handlePan:(UIPanGestureRecognizer *)pan
{
   self.tableView.panGestureRecognizer.enabled = YES;

   NSLog(@"哈哈哈哈哈这是第%ld次响应滑动手势handlePan 方法", self.panNum);
   if (self.panNum % 2 == 0) {
       self.tableView.panGestureRecognizer.enabled = NO;
   } else {
       self.tableView.panGestureRecognizer.enabled = YES;
   }
   self.tableView.panGestureRecognizer.enabled = YES;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Veuillez ajouter une description de l'image

Le code complet pour le test ci-dessus

//
//  LBPangestureController.m
//  TEXT
//
//  Created by mac on 2024/7/7.
//  Copyright © 2024 刘博. All rights reserved.
//

#import "LBPangestureController.h"

@interface LBPangestureController () <UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate>

@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) UIPanGestureRecognizer *pangesture;

@property (nonatomic, assign) NSInteger panNum;

@end

@implementation LBPangestureController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.tableView];
    [self.view addGestureRecognizer:self.pangesture];
    // Do any additional setup after loading the view.
}


- (void)handlePan:(UIPanGestureRecognizer *)pan
{
    self.tableView.panGestureRecognizer.enabled = YES;

    NSLog(@"哈哈哈哈哈这是第%ld次响应滑动手势handlePan 方法", self.panNum);
    if (self.panNum % 2 == 0) {
        self.tableView.panGestureRecognizer.enabled = NO;
    } else {
        self.tableView.panGestureRecognizer.enabled = YES;
    }
    self.tableView.panGestureRecognizer.enabled = YES;
}

#pragma mark  - UITableViewDelegate, UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class])];
    cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row];
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 100;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}

#pragma mark - uiscrollViewdelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"哈哈哈哈哈这里是执行scrollViewDidScroll self.panNum是%ld", self.panNum);
}

#pragma mark - gesturedelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer == self.pangesture) {
        self.panNum ++;
    }
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (gestureRecognizer == self.pangesture && otherGestureRecognizer == self.tableView.panGestureRecognizer) {
        return YES;
    }
    return NO;
}

#pragma mark - lazy load

- (UITableView *)tableView
{
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 300, 400) style:UITableViewStylePlain];
        [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        _tableView.backgroundColor = [UIColor cyanColor];
    }
    return _tableView;
}

- (UIPanGestureRecognizer *)pangesture
{
    if (!_pangesture) {
        _pangesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        _pangesture.delegate = self;
    }
    return _pangesture;
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122