[英]UIButton inside UITableViewCell steals touch from UITableView
[英]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.