моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Иногда мы сталкиваемся с таким интерактивным сценарием: у нас есть UITableView
Поместите его во всплывающее окно. Это всплывающее окно можно отобразить и скрыть, сдвинув его (проведя рукой). Затем этот UITableView помещается во всплывающее окно и его можно прокручивать для отображения некоторого содержимого, например информация о продукте и комментарии (аналогично всплывающему окну комментариев Douyin), а при скольжении вниз, если tableView сдвинулся вверх, вы можете ответить на жест скольжения и продолжить сдвигать всплывающее окно вниз.
Во-первых, у нас есть tableView во всплывающем окне. Этот tableView может нормально перемещаться. Затем мы добавляем жест скольжения во всплывающее окно. В методе ответа на этот жест мы изменяем рамку всплывающего окна. окно.Таким образом, это всплывающее окно представляет собой прокси, реагирующий на жесты.
квадрат и в
Мы добавляем скользящий жест во всплывающее окно, а метод ответа — handlePan:
В результате тестирования мы обнаружили, чтоКогда наша рука прокручивает tableView, каждый раз, когда мы выполняем
Перед прокси-методом tableView ScrollViewDidScroll будет выполнен метод handlePan.
Причем во время свайпа (тот же свайп засчитывается, если рука не отрывается от экрана),
Если он был установлен в методе ответа handlePan
self.tableView.panGestureRecouncer.enabled = НЕТ вызовет;
self.tableView не будет прокручиваться во время этого слайда, даже если self.tableView.panGestureRecouncer.enabled = YES установлено после self.tableView.panGestureRecouncer.enabled = NO, он не будет прокручиваться.
Это показывает, что **В ответ на скользящий жест self.tableView.panGestureRecouncer.enabled = NO имеет наивысший приоритет.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"哈哈哈哈哈这里是执行scrollViewDidScroll self.panNum是%ld", self.panNum);
}
- (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;
}
Полный код приведенного выше теста
//
// 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