Compartir tecnología

iOS UITableView viene con gestos deslizantes y la vista principal agrega exploración del mecanismo de respuesta a conflictos de gestos deslizantes

2024-07-12

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

Escenas

A veces nos encontramos con un escenario tan interactivo: tenemos un UITableView
Colóquelo en una ventana emergente. Esta ventana emergente se puede mostrar y desaparecer deslizándola (deslizando la mano). Luego, este UITableView se coloca en la ventana emergente y se puede desplazar para mostrar algún contenido, como por ejemplo. información del producto y comentarios (similar a la ventana emergente de comentarios de Douyin), y al deslizarse hacia abajo, si tableView se ha deslizado hacia la parte superior, puede responder al gesto de deslizamiento y continuar deslizando la ventana emergente hacia abajo.

Ideas

Primero, tenemos un tableView en la vista emergente. Este tableView se puede deslizar normalmente. Luego, agregamos un gesto de deslizamiento a la vista emergente. En el método de respuesta del gesto, modificamos el marco de la ventana emergente. ventana.Por lo tanto, esta vista emergente es un proxy que responde a gestos.
cuadrado y en

  • (BOOL)ReconocedorDeGestos:(UIReconocedorDeGestos *)ReconocedorDeGestos deberíaReconocerSimultáneamenteConReconocedorDeGestos:(UIReconocedorDeGestos *)otroReconocedorDeGestos
    En el método proxy, si gestoRecognizer es su propio gesto deslizante y otroGestureRecognizer es el gesto deslizante de tableView, debe admitir una respuesta simultánea, es decir, devolver SÍ. Al mismo tiempo, debemos tener una idea, es decir, si. nuestro
    Cuando tableView se desplaza hacia la parte superior, debe configurar el gesto de desplazamiento de tablView para que no admita la respuesta. De lo contrario, tableView continuará desplazándose cuando se desplace hacia la parte superior. Si desliza tableView hacia adelante y hacia atrás en este momento, lo hará. provocar ventanas emergentes y tableView En el caso del desplazamiento simultáneo, esto es algo que no queremos, por lo que cuando nuestro tablView se desplaza hacia la parte superior, debemos configurar pangesture.enabled = NO de tableView.

Mecanismo de respuesta de desplazamiento con gesto de doble deslizamiento

Agregamos un gesto deslizante a la ventana emergente y el método de respuesta es handlePan:
A través de pruebas encontramos queCuando nuestra mano se desplaza sobre tableView, cada vez que ejecutamos
Antes del método proxy de tableView, scrollViewDidScroll, se ejecutará el método handlePan.

Por favor agregue la descripción de la imagen.

Además, durante un deslizamiento (el mismo deslizamiento se cuenta si la mano no sale de la pantalla),
Si se ha configurado en el método de respuesta handlePan
self.tableView.panGestureRecognizer.enabled = NO causará;
self.tableView no se desplazará durante esta diapositiva, incluso si self.tableView.panGestureRecognizer.enabled = YES se establece después de self.tableView.panGestureRecognizer.enabled = NO, no se desplazará.

Esto muestra que **En respuesta a un gesto de deslizamiento, self.tableView.panGestureRecognizer.enabled = NO tiene la máxima prioridad

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

Por favor agregue la descripción de la imagen.

El código completo para la prueba anterior.

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