Berbagi teknologi

iOS UITableView hadir dengan gerakan geser dan tampilan induk menambahkan eksplorasi mekanisme respons konflik gerakan geser

2024-07-12

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

Adegan

Terkadang kita menghadapi skenario interaktif seperti ini: kita memiliki UITableView
Letakkan di jendela pop-up. Jendela pop-up ini dapat ditampilkan dan dihilangkan dengan cara menggeser (swipe dengan tangan). Kemudian UITableView ini ditempatkan di jendela pop-up dan dapat di-scroll untuk menampilkan beberapa konten, seperti informasi produk dan komentar (mirip dengan jendela pop-up komentar Douyin), dan ketika menggeser ke bawah, jika tableView telah meluncur ke atas, Anda dapat merespons gerakan menggeser dan terus menggeser jendela pop-up ke bawah.

Ide ide

Pertama, kita memiliki tableView dalam tampilan pop-up. TableView ini dapat meluncur secara normal. Kemudian, kita menambahkan gerakan geser ke tampilan pop-up jendela.Oleh karena itu, tampilan pop-up ini merupakan proxy yang merespons isyarat
persegi dan dalam

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer harusMengenaliSecaraBersamaanDenganGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    Dalam metode proxy, jika isyaratRecognizer adalah isyarat gesernya sendiri dan otherGestureRecognizer adalah isyarat geser dari tableView, maka ia perlu mendukung respons simultan, yaitu mengembalikan YA kita
    Saat tableView bergulir ke atas, Anda perlu menyetel gerakan gulir tablView agar tidak mendukung respons. Jika tidak, tableView akan terus bergulir saat bergulir ke atas. Jika Anda menggeser tableView bolak-balik saat ini, itu akan terjadi menyebabkan pop-up dan tableView Dalam kasus pengguliran simultan, ini adalah sesuatu yang tidak kita inginkan, jadi ketika tablView kita bergulir ke atas, kita perlu mengatur pangesture.enabled = NO tableView.

Mekanisme respons gulir gerakan gesek ganda

Kami menambahkan gerakan geser ke jendela pop-up, dan metode responsnya adalah handlePan:
Melalui pengujian kami menemukan ituSaat tangan kita menggulir pada tableView, setiap kali kita mengeksekusi
Sebelum metode proxy tableView scrollViewDidScroll, metode handlePan akan dieksekusi.

Silakan tambahkan deskripsi gambar

Selain itu, saat menggesek (gesekan yang sama dihitung jika tangan tidak meninggalkan layar),
Jika sudah di setting pada metode respon handlePan
self.tableView.panGestureRecognizer.enabled = TIDAK akan menyebabkan
self.tableView tidak akan bergulir selama slide ini, meskipun self.tableView.panGestureRecognizer.enabled = YES disetel setelah self.tableView.panGestureRecognizer.enabled = NO, itu tidak akan bergulir.

Hal ini menunjukkan bahwa **Sebagai respons terhadap gerakan geser, self.tableView.panGestureRecognizer.enabled = NO memiliki prioritas tertinggi

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

Silakan tambahkan deskripsi gambar

Kode lengkap untuk tes di atas

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