Подтвердить что ты не робот

Как удалить задержку касания от пользовательского UIButton в UITableViewCell

У меня есть пользовательская кнопка, где изображение изменяется при нажатии. Эта кнопка находится в contentView UITableViewCell в UITableView.

При нажатии кнопки до изменения изображения происходит заметная задержка. Выньте кнопку из ячейки и в UIView мгновенное изменение изображения при нажатии.

Как удалить эту задержку?

Стоит отметить, что я пробовал устанавливать задерживанияContentTouches в UITableView, но не имеет никакого значения, что я могу видеть.

Вот несколько тестовых кодов, которые доказывают эту проблему. Создайте новый проект и добавьте UITableView в раскадровку.

#import "JWViewController.h"

@implementation JWViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.delaysContentTouches = NO;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; }
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return return 65.0f; }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:[UIImage imageNamed:@"apple"] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:@"apple_selected"] forState:UIControlStateHighlighted];
    button.frame = CGRectMake(0, 0, 65, 65);
    [cell.contentView addSubview:button];
    return cell;
}

@end

Я искал, и, как представляется, существует несколько других сообщений, относящихся к этому, но ни с кем рабочий ответ.

Это сообщение в блоге, похоже, не работает в этом простом случае.

4b9b3361

Ответ 1

Наконец-то вы получили решение своей проблемы.

Попробуй, все будет хорошо. Добавьте шаги в существующий код: 1.) Установите тег кнопки, которая находится в режиме просмотра содержимого. 2.) Добавить цель на этой кнопке.

- (void)viewDidLoad
    {
        [super viewDidLoad];
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        self.tableView.delaysContentTouches = NO;
    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; }
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 65.0f; }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [[UITableViewCell alloc] init];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageNamed:@"apple.jpg"] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"apple_selected.png"] forState:UIControlStateHighlighted];
        button.frame = CGRectMake(0, 0, 65, 65);
        button.tag = indexPath.row;
        [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventAllTouchEvents];
        [cell.contentView addSubview:button];
        return cell;
    }

    - (void)buttonPressed:(UIButton *)sender
    {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:sender.tag inSection:0]];

        for (UIView *currentView in cell.subviews)
        {
            if ([NSStringFromClass([currentView class]) isEqualToString:@"UITableViewCellScrollView"])
            {
                UIScrollView *svTemp = (UIScrollView *) currentView;
                [svTemp setDelaysContentTouches:NO];
                break;
            }
        }
    }

Ответ 2

Я смог исправить это решение: fooobar.com/questions/84182/...

Кажется, что в представлении таблицы есть другое scrollview внутри.

Ответ 3

Подкласс UITableView и реализовать только этот метод:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    return YES;
}

Затем установите tableView.delaysContentTouches = NO;

Ответ 4

Вам нужно передать событие касания непосредственно на кнопку.

 [yourTableViewObject setDelaysContentTouches:NO];

Это отключает прокрутку представления таблицы при нажатии кнопки. вы можете справиться с этим, используя либо распознаватель жеста или подклассику tableview для реализации

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}