Technologieaustausch

iOS UITableView verfügt über Schiebegesten und die übergeordnete Ansicht fügt die Erkundung von Konfliktreaktionsmechanismen für Schiebegesten hinzu

2024-07-12

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

Szenen

Manchmal stoßen wir auf ein solches interaktives Szenario: Wir haben eine UITableView
Platzieren Sie es in einem Popup-Fenster, indem Sie es verschieben (mit der Hand wischen). Dann wird diese UITableView im Popup-Fenster platziert und kann gescrollt werden, um einige Inhalte anzuzeigen Produktinformationen und Kommentare (ähnlich dem Kommentar-Popup-Fenster von Douyin). Wenn Sie nach unten schieben und die Tabellenansicht nach oben gerutscht ist, können Sie auf die Schiebegeste reagieren und das Popup-Fenster weiter nach unten schieben.

Ideen

Zuerst haben wir eine TableView in der Popup-Ansicht. Diese TableView kann dann normal verschoben werden. In der Antwortmethode der Geste ändern wir den Rahmen des Popups Fenster.Daher ist diese Popup-Ansicht ein Proxy, der auf Gesten reagiert
Quadrat und in

  • (BOOL)Gestenerkenner:(UIGestureRecognizer *)Gestenerkenner solltegleichzeitig mit demGestureRecognizererkennen:(UIGestureRecognizer *)andererGestureRecognizer
    Wenn in der Proxy-Methode „gesteRecognizer“ eine eigene Schiebegeste und „otherGestureRecognizer“ eine Schiebegeste von tableView ist, muss es eine gleichzeitige Antwort unterstützen, das heißt, „JA“ zurückgeben. Gleichzeitig müssen wir eine Idee haben, das heißt, wenn unser
    Wenn die Tabellenansicht nach oben scrollt, müssen Sie die Scroll-Geste der Tabellenansicht so einstellen, dass sie keine Reaktion unterstützt. Andernfalls scrollt die Tabellenansicht weiter, wenn Sie die Tabellenansicht zu diesem Zeitpunkt hin und her schieben Popups verursachen und tableView Beim gleichzeitigen Scrollen möchten wir dies nicht. Wenn also unsere tablView nach oben scrollt, müssen wir pangesture.enabled = NO der tableView festlegen.

Dual-Swipe-Gesten-Scroll-Reaktionsmechanismus

Wir fügen dem Popup-Fenster eine Schiebegeste hinzu und die Antwortmethode ist handlePan:
Durch Tests haben wir das herausgefundenWenn unsere Hand jedes Mal, wenn wir sie ausführen, auf der TableView scrollt
Vor der Proxy-Methode scrollViewDidScroll von tableView wird die handlePan-Methode ausgeführt.

Bitte fügen Sie eine Bildbeschreibung hinzu

Darüber hinaus wird während eines Wischens (dasselbe Wischen wird gezählt, wenn die Hand den Bildschirm nicht verlässt)
Wenn es in der Antwortmethode handlePan festgelegt wurde
self.tableView.panGestureRecognizer.enabled = NO; wird verursachen
self.tableView scrollt während dieser Folie nicht, auch wenn self.tableView.panGestureRecognizer.enabled = YES nach self.tableView.panGestureRecognizer.enabled = NO gesetzt ist, wird kein Scrollen durchgeführt.

Dies zeigt, dass **Als Reaktion auf eine Schiebegeste self.tableView.panGestureRecognizer.enabled = NO die höchste Priorität hat

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

Bitte fügen Sie eine Bildbeschreibung hinzu

Der vollständige Code für den obigen Test

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