Κοινή χρήση τεχνολογίας

Το iOS UITableView έρχεται με συρόμενες χειρονομίες και η γονική προβολή προσθέτει εξερεύνηση μηχανισμού απόκρισης διένεξης χειρονομιών

2024-07-12

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

Σκηνές

Μερικές φορές συναντάμε ένα τέτοιο διαδραστικό σενάριο: έχουμε ένα UITableView
Τοποθετήστε το σε ένα αναδυόμενο παράθυρο Αυτό το αναδυόμενο παράθυρο μπορεί να εμφανιστεί και να εξαφανιστεί σύροντας το χέρι σας, στη συνέχεια, αυτό το UITableView τοποθετείται στο αναδυόμενο παράθυρο και μπορεί να γίνει κύλιση για να εμφανιστεί κάποιο περιεχόμενο, π.χ πληροφορίες προϊόντος και σχόλια (παρόμοια με το αναδυόμενο παράθυρο σχολίων του Douyin) και όταν σύρετε προς τα κάτω, εάν το tableView έχει ολισθήσει στην κορυφή, μπορείτε να απαντήσετε στη συρόμενη κίνηση και να συνεχίσετε να σύρετε το αναδυόμενο παράθυρο προς τα κάτω.

Ιδέες

Πρώτα, έχουμε ένα tableView στην αναδυόμενη προβολή Αυτό το tableView μπορεί να ολισθαίνει κανονικά. Στη συνέχεια, προσθέτουμε μια συρόμενη κίνηση στην αναδυόμενη προβολή παράθυρο.Επομένως, αυτή η αναδυόμενη προβολή είναι ένας διακομιστής μεσολάβησης που ανταποκρίνεται σε χειρονομίες
πλατεία και μέσα

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    Στη μέθοδο μεσολάβησης, εάν το gestureRecognizer είναι η δική του συρόμενη χειρονομία και το otherGestureRecognizer είναι η συρόμενη χειρονομία του tableView, πρέπει να υποστηρίζει ταυτόχρονη απόκριση, δηλαδή να επιστρέψει YES Ταυτόχρονα, πρέπει να έχουμε μια ιδέα, δηλαδή εάν μας
    Όταν το tableView μετακινείται προς τα πάνω, πρέπει να ρυθμίσετε τη χειρονομία κύλισης του tablView, διαφορετικά, το tableView θα συνεχίσει να κάνει κύλιση όταν μετακινηθεί προς τα πάνω προκαλέσει αναδυόμενα παράθυρα και tableView Στην περίπτωση ταυτόχρονης κύλισης, αυτό είναι κάτι που δεν θέλουμε, οπότε όταν το tablView μας μεταβαίνει στην κορυφή, πρέπει να ορίσουμε το pangesture.enabled του tableView = ΟΧΙ.

Μηχανισμός απόκρισης κύλισης με χειρονομία διπλού σάρωσης

Προσθέτουμε μια συρόμενη κίνηση στο αναδυόμενο παράθυρο και η μέθοδος απόκρισης είναι handlePan:
Μέσα από δοκιμές το βρήκαμεΌταν το χέρι μας κάνει κύλιση στο tableView, κάθε φορά που εκτελούμε
Πριν από τη μέθοδο μεσολάβησης του tableView scrollViewDidScroll, θα εκτελεστεί η μέθοδος handlePan.

Προσθέστε περιγραφή εικόνας

Επιπλέον, κατά τη διάρκεια ενός σάρωσης (το ίδιο σάρωση μετράται αν το χέρι δεν φεύγει από την οθόνη),
Εάν έχει οριστεί στη μέθοδο απόκρισης handlePan
self.tableView.panGestureRecognizer.enabled = ΟΧΙ θα προκαλέσει
Το self.tableView δεν θα πραγματοποιήσει κύλιση κατά τη διάρκεια αυτής της διαφάνειας, ακόμα κι αν το self.tableView.panGestureRecognizer.enabled = YES έχει οριστεί μετά το self.tableView.panGestureRecognizer.enabled = ΟΧΙ, δεν θα πραγματοποιήσει κύλιση.

Αυτό δείχνει ότι **Σε απόκριση σε μια συρόμενη χειρονομία, η self.tableView.panGestureRecognizer.enabled = ΟΧΙ έχει την υψηλότερη προτεραιότητα

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

Προσθέστε περιγραφή εικόνας

Ο πλήρης κωδικός για το παραπάνω τεστ

//
//  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