簡體   English   中英

如何從UITableViewCell中的自定義UIButton中刪除觸摸延遲

[英]How to remove touch delay from custom UIButton in UITableViewCell

我有一個自定義按鈕,按下時圖像會發生變化。 此按鈕位於UITableView中UITableViewCell的contentView中。

在圖像更改之前按下按鈕會有明顯的延遲。 將按鈕從單元格中取出並進入UIView,即時按下圖像的變化。

如何刪除此延遲?

值得指出的是,我已經嘗試在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

我搜索過,似乎還有其他一些與此有關的帖子 ,但沒有一個有工作答案。

在這個簡單的案例中, 這篇博文似乎不起作用。

最后解決了你的問題。

試試這個,它會正常工作。 在現有代碼中添加步驟: - 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;
            }
        }
    }

我能夠使用此解決方案進行修復: https//stackoverflow.com/a/29259705/1728552

似乎表視圖里面有另一個scrollview。

子類UITableView,並只實現此方法:

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

然后設置tableView.delaysContentTouches = NO;

您需要將觸摸事件直接傳遞給按鈕。

 [yourTableViewObject setDelaysContentTouches:NO];

當觸摸按鈕時,這將禁用滾動表格視圖。 你可以通過使用Gesture識別器或子類化tableview來實現它

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM