iOS UITableView 的坑:isDragging 属性无效

简要:对于 UITableView、UICollectionView,如果要判断用户是否正在拖拽,要使用 isTracking 属性代替 isDragging 属性

在 iOS 里,键盘弹起之后,如果用户想让键盘收起,一个常见的做法是当用户上下划动一下 tableView 的时候就把键盘收起。比如京东商品评论就是这么做的。

上下略微划动一下页面,键盘就会收起

那么如何实现这个效果呢?最简单的想法是:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}

但这样写有一个问题:除了用户手动地上下划动,其他原因造成的滚动也会触发这个回调函数。例如,当键盘弹出的时候,为了让 tableView 的内容能完全显示,往往会将 tableView 的底部 inset 改为键盘高度,此时也会触发scrollViewDidScroll:事件。如果像上面写的话,就会导致键盘又被收起来了。

所以,我们自然想到用 scrollView 的isDragging属性来判断一下滚动的原因,是否是用户拖拽导致的:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.isDragging) {
        [self.view endEditing:YES];
    }
}

理论上这样写应该没有任何问题,然而实际却不能用!因为测试发现,即使不是用户划动,isDragging属性也可能为YES。比如上面的例子,由于改变 inset 导致的滚动,用户并没有拖拽,然而isDragging属性仍为YES

也就是说,isDragging属性在 UITableView 上是不能用的,它的值并不总是正确,并不能正确反映出用户是否在拖拽。UICollectionView 也有同样的问题。

要解决这个问题,我们只能用isTracking代替isDragging。所以改成:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.isTracking) {
        [self.view endEditing:YES];
    }
}

就没有问题了。

查了一下苹果文档,并没有相关的解释,看来又是官方实现的一个小 bug 了。

p.s. 文中的效果也可以用下面这个方法实现:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,687评论 4 61
  • G:【心理咨询中的指导性技术】通过解释(附加共情、提供信息、想象、面质、自我暴露 1、解释技术。加强来访者的视野,...
    木子青青草阅读 1,441评论 0 0
  • 复习消费者行为理论,自己和以前的感悟有所差异。以前,学起来总有些空中楼阁的感觉,难以理解。但这几年,经过研究生的经...
    河马先森阅读 1,738评论 0 0

友情链接更多精彩内容