在非弹跳UITableView中滚动后,在第一次点击时行选择不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在非弹跳UITableView中滚动后,在第一次点击时行选择不起作用相关的知识,希望对你有一定的参考价值。

基本上我看到的问题似乎是一个Apple bug。问题是在滚动表格之后,任何行上的第一次点击只会突出显示它。需要第二次点击才能实际选择或取消选择它。我注意到这个问题大多数时间都会发生。它很少会按预期工作,但我没有注意到它何时起作用的模式。

这个问题只发生在theTableView.bounces = NO;否则,它完美地运作。

我通过实现适当的委托方法来验证这一点。

滚动后首先点击任意一行,我得到这些回叫

-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath

滚动后在相同或不同的行上进行后续点击,我得到这些回调

-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath

//then

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//or
-(NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

我已经看到了其他类似的问题,但是所有这些问题都在另一个滚动视图中使用了一个表,这不是这里的情况。

有没有人为此找到修复或解决方法?我试过ios 7.0 ... 8.2并且所有这些问题都存在。

谢谢!

答案

经过大量的测试,我发现问题发生在表的contentOffset.y达到最大值或0时。所以我创建了自己的“弹跳效果”,但是通过在表视图的委托中实现scrollViewWillEndDragging:withVelocity:targetContentOffset:,规模要小得多,如下所示:

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    targetContentOffset->y = MAX(targetContentOffset->y -1, 1);
}

有了这个,问题就消失了。这是一种解决方法,但就像一个魅力!

另一答案

this comment的Swift 4语法:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    targetContentOffset.pointee.y = max(targetContentOffset.pointee.y - 1, 1)
}

以上是关于在非弹跳UITableView中滚动后,在第一次点击时行选择不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有导航栏大标题的 UITableView 奇怪的滚动行为,顶部的弹跳效果在滚动到顶部时自动切断/生涩

如何更改 UITableView 的弹跳范围

使用 UITableViewController 时,我应该如何实现非弹跳 UITableView?

滚动时禁用 UITableView 垂直反弹

下拉时 UITableVIew 标头没有弹跳

弹出窗口中的 UITableView 不会停止滚动