UITableView 在水平滚动后不会响应点击

Posted

技术标签:

【中文标题】UITableView 在水平滚动后不会响应点击【英文标题】:UITableView will not respond tap after scroll horizontally 【发布时间】:2015-11-18 08:57:26 【问题描述】:

我有一个嵌入在 ViewController 根视图中的 UITableView。这个 UITableView 包含多个列。而且这些列不能在一屏显示,所以我让 UITableView 可以水平滚动。这是使tableview水平滚动的代码:

    - (void)viewDidAppear:(BOOL)animated
    
        CGSize size = self.tableView.contentSize;
        size.width = 450;
        self.tableView.contentSize = size;
        [self.tableView layoutIfNeeded];
    

这很好用,表格可以水平和垂直滚动。在原始屏幕中(没有滚动发生),我可以选择一行,并且可以突出显示选定的行。

我的问题是:如果我将 UITableView 向左滚动一点,并且在滚动之前未显示的区域,则 UITableView 无法响应点击事件。因此,我手指下的行将不会被选中和突出显示。但是如果我在同一区域滑动,我可以滚动。

有人知道我做错了什么吗?感谢您的 cmets 并提前感谢。

【问题讨论】:

【参考方案1】:

我了解您的问题,总有一种简单的方法可以解决复杂的问题。您需要的功能可以通过使用UICollectionView 来实现。 在您的 UITableViewCell 添加UICollectionView。在这种方法中,您的代码将变得更清晰,您可以轻松实现您的功能。 这里是关于 UICollectionView 的非常简单的tutorial。 http://www.appcoda.com/ios-programming-uicollectionview-tutorial/

【讨论】:

感谢您的帖子。这样一来,所有的数据都可以显示在屏幕上,不需要横向滚动,对吧?但是对于我的场景,数据必须列在一行中,因为它们是真实的电子表格,例如我教室中学生的考试成绩。 你也可以使用带有分页和collectionview的滚动视图,它会让你的collectionview变成2页 @Tj3n 我会尝试这种方式。但另一方面,你能在我的解决方案中评论这个问题吗?【参考方案2】:

最后,我认为这是 UITableView 的一个错误。我通过子类 UITableView 获得了解决该问题的方法。这里是:

    // in my own UITableView subclass .m file
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    
        NSLog(@"MonthDetailTableView: touchesEnded");

        UITouch * touch = [touches anyObject];
        CGPoint point = [touch locationInView:self];

        if (point.x < self.frame.size.width)
        
            [super touchesEnded:touches withEvent:event];
        
        else
        
            // if not adjust by mod, the NSIndexPath returned by indexPathForRowAtPoint 
            // will be nil. I think this is a bug of UITableView
            point.x = (int)point.x % (int)self.frame.size.width;
            NSIndexPath *path = [self indexPathForRowAtPoint:point];
            [self selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];

            if (self.delegate != nil &&
                [self.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
            
                [self.delegate tableView:self didSelectRowAtIndexPath:path];
            
        
    

【讨论】:

以上是关于UITableView 在水平滚动后不会响应点击的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView中的UITableView在滚动后没有响应第一次点击

UITableView 在滚动时不响应某些触摸

水平滚动 UITableView 的奇怪行为(在 Monotouch 中)

为啥我的子类 UItableView 不滚动?

UITableView 水平滚动指示器

NSURLConnection 在 UITableView 滚动之前不会“触发”