与 UITableView 外部的其他按钮相比,TableHeaderView 中的自定义 UIButton 响应速度不快
custom UIButton in TableHeaderView does not respond fast compared to other buttons outside UITableView
我在故事板中有一个 UITableView
,我以编程方式在 UITableHeaderView
中编写按钮。我为灰色和红色的按钮设置了正常和突出显示的图像,其他外部 UITableView's
按钮也是如此。
如果我触摸所有按钮,按钮图像颜色会按预期从灰色变为红色,但是,如果我触摸得非常快,比如只需点击屏幕并在非常非常短的时间内离开屏幕, header 视图中的按钮不会改变图像颜色。但是 table 视图之外的其他按钮可以非常快速地改变图像颜色,几乎在我点击屏幕和离开屏幕的同时。
我很困惑这是怎么回事,因为它们共享相同的 setImage 代码。我能想到的是 UITableView
会影响按钮的性能吗?还是我做错了什么?
下面是 headverView 的代码:
- (void) setupProjectTableHeaderView {
CGRect ProjectBounds = self.ProjectTableView.bounds;
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(ProjectBounds.origin.x,
ProjectBounds.origin.y,
ProjectBounds.size.width,
100)];
UIButton *HomeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[HomeBtn setFrame:CGRectMake(ProjectBounds.origin.x,
ProjectBounds.origin.y,
ProjectBounds.size.width,
50)];
HomeBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 12, 0, 0);
[HomeBtn setTitle:@"Home" forState:UIControlStateNormal];
[HomeBtn.titleLabel setFont:[UIFont systemFontOfSize:20]];
[HomeBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
HomeBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 25, 0, 0);
[HomeBtn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
view.userInteractionEnabled = YES;
[view addSubview:HomeBtn];
self.ProjectTableView.tableHeaderView = view;
}
我做了很多搜索,发现:
self.ProjectTableView.delaysContentTouches = NO;
是解决我问题的关键。
似乎 UITableView 中的触摸事件被延迟了,所以如果将其设置为 NO,它将像普通按钮一样响应。
试试这个代码:
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
headerView.backgroundColor=[UIColor redColor];
UIButton *btn=[[UIButton alloc] init];
[btn setTitle:@"Button" forState:UIControlStateNormal];
btn.tag=section;
btn.frame=CGRectMake(0, 0, 320, 50);
[btn addTarget:self 动作:@selector(sectionBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[headerView addSubview:btn];
return headerView;
}
-(void)sectionBtnClicked:(id)发件人{
UIButton *btn=(UIButton*)sender;
[[[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"Button %d Clicked",btn.tag] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
}
我在故事板中有一个 UITableView
,我以编程方式在 UITableHeaderView
中编写按钮。我为灰色和红色的按钮设置了正常和突出显示的图像,其他外部 UITableView's
按钮也是如此。
如果我触摸所有按钮,按钮图像颜色会按预期从灰色变为红色,但是,如果我触摸得非常快,比如只需点击屏幕并在非常非常短的时间内离开屏幕, header 视图中的按钮不会改变图像颜色。但是 table 视图之外的其他按钮可以非常快速地改变图像颜色,几乎在我点击屏幕和离开屏幕的同时。
我很困惑这是怎么回事,因为它们共享相同的 setImage 代码。我能想到的是 UITableView
会影响按钮的性能吗?还是我做错了什么?
下面是 headverView 的代码:
- (void) setupProjectTableHeaderView {
CGRect ProjectBounds = self.ProjectTableView.bounds;
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(ProjectBounds.origin.x,
ProjectBounds.origin.y,
ProjectBounds.size.width,
100)];
UIButton *HomeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[HomeBtn setFrame:CGRectMake(ProjectBounds.origin.x,
ProjectBounds.origin.y,
ProjectBounds.size.width,
50)];
HomeBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 12, 0, 0);
[HomeBtn setTitle:@"Home" forState:UIControlStateNormal];
[HomeBtn.titleLabel setFont:[UIFont systemFontOfSize:20]];
[HomeBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
HomeBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 25, 0, 0);
[HomeBtn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
view.userInteractionEnabled = YES;
[view addSubview:HomeBtn];
self.ProjectTableView.tableHeaderView = view;
}
我做了很多搜索,发现:
self.ProjectTableView.delaysContentTouches = NO;
是解决我问题的关键。
似乎 UITableView 中的触摸事件被延迟了,所以如果将其设置为 NO,它将像普通按钮一样响应。
试试这个代码:
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
headerView.backgroundColor=[UIColor redColor];
UIButton *btn=[[UIButton alloc] init];
[btn setTitle:@"Button" forState:UIControlStateNormal];
btn.tag=section;
btn.frame=CGRectMake(0, 0, 320, 50);
[btn addTarget:self 动作:@selector(sectionBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; [headerView addSubview:btn];
return headerView;
} -(void)sectionBtnClicked:(id)发件人{
UIButton *btn=(UIButton*)sender;
[[[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"Button %d Clicked",btn.tag] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
}