bry*_*ark 2 iphone uitableview ios
我正在构建一个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;
}
目前,会发生以下情况: - 如果桌面视图没有滚动,则按钮按预期执行:点击它,按钮将获得TouchUpInside手势. - 如果桌面视图正在滚动,则该按钮不会获得TouchUpInside手势 - 相反,桌面视图就会停止.
我已经尝试了子类化UITableView并查看touchesBegan:方法等,但这些都没有用.我看到相同的模式:只有/当tableview没有移动时,手势才会出现.
更新: 这不是一个可用性问题 - 虽然我无法显示我正在处理的设计的屏幕截图,但是在节标题中使用按钮和控件是一个有效的用例.
这是一个快速草图来解释原因:

弄清楚了!您需要做的就是子类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次通话).此代码足以满足我的需求,但如果您在应用中使用此代码,请注意该问题 - 您可能需要修改上述代码才能解决此问题.
| 归档时间: | 
 | 
| 查看次数: | 1663 次 | 
| 最近记录: |