我有一个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无法响应点击事件。因此,我的手指下的行将不会被选中并突出显示。但是如果我在同一区域刷卡,我可以滚动。
任何人都知道我做错了什么?感谢您的评论,并提前致谢。
答案 0 :(得分:0)
我理解您的问题并且始终有一种简单的方法来解决复杂问题。您可以使用UICollectionView来实现所需的功能。 在你的UITableViewCell中添加UICollectionView。在这种方法中,你的代码将变得更清晰,你可以毫不费力地实现你的功能。 关于UICollectionView,这是非常简单的tutorial。 http://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];
}
}
}