水平滚动后,UITableView不会响应tap

时间:2015-11-18 08:57:26

标签: ios objective-c uitableview

我有一个UITableView,它嵌入在ViewController的根视图中。此UITableView包含多个列。并且这些列无法在一个屏幕中显示,因此我使UITableView可以水平滚动。以下是使tableview水平滚动的代码:

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

这样可以正常工作,表格可以水平和垂直滚动。在原始屏幕中(没有滚动发生),我可以选择一行,并且可以突出显示所选行。

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

任何人都知道我做错了什么?感谢您的评论,并提前致谢。

2 个答案:

答案 0 :(得分:0)

我理解您的问题并且始终有一种简单的方法来解决复杂问题。您可以使用UICollectionView来实现所需的功能。 在你的UITableViewCell中添加UICollectionView。在这种方法中,你的代码将变得更清晰,你可以毫不费力地实现你的功能。 关于UICollectionView,这是非常简单的tutorialhttp://www.appcoda.com/ios-programming-uicollectionview-tutorial/

答案 1 :(得分:0)

最后,我认为这是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];
            }
        }
    }