gpt4 book ai didi

iphone - 在 tableview 滚动时拦截 UITableView 中的 TouchUpInside 事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:12 27 4
gpt4 key购买 nike

我正在构建一个 UITableView,它在 tableview 的部分标题中有一个按钮,以便当用户向下滚动屏幕时,该按钮固定在屏幕顶部。

问题是 当 UITableView 移动时,部分标题按钮的触摸事件没有注册。如果 tableview 没有滚动,按钮只会获得触摸事件。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (!_sectionHeaderView) {
_sectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 50, 50);
[backButton setImage:[UIImage imageNamed:@"upArrow"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(scrollToTop:) forControlEvents:UIControlEventTouchUpInside];
[_sectionHeaderView addSubview:backButton];

}
return _sectionHeaderView;
}

目前,发生的是:- 如果 tableview 没有滚动,按钮将按您预期的方式执行:点击它,按钮将获得 TouchUpInside 手势。- 如果 tableview 正在滚动,则按钮不会获​​得 TouchUpInside 手势 - 相反,tableview 只是停在原地。

我已经尝试子类化 UITableView 并查看 touchesBegan: 方法等,但没有用。我看到了相同的模式:手势仅在 tableview 不移动时显示。

更新:这不是可用性问题 - 虽然我无法显示我正在处理的设计的屏幕截图,但在部分标题中使用按钮和控件是一个有效的用例。

这里有一个快速的草图来解释原因:

Floating section header

最佳答案

想通了!您需要做的就是继承 UITableView,并覆盖 hitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if ([[super hitTest:point withEvent:event] isKindOfClass:[UIButton class]]) {
UIButton *buttonThatWasTapped = (UIButton *)[super hitTest:point withEvent:event];
[buttonThatWasTapped sendActionsForControlEvents:UIControlEventTouchUpInside];
}
return [super hitTest:point withEvent:event];
}

下面是这段代码的作用:如果触摸了 tableview,并且触摸发生在 UIButton 的边界内,tableview 会将触摸事件转发给 UIButton。

这里有一个警告:触摸事件可能会多次发送到 UIButton(我看到每次触摸都会调用 3 次)。此代码足以满足我的需求,但如果您在应用中使用此代码,请注意该问题 - 您可能需要修改上述代码以解决此问题。

关于iphone - 在 tableview 滚动时拦截 UITableView 中的 TouchUpInside 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com