UICollectionView SelectItem方法无效的原因

问题引入

前几天做项目的时候,发现下面代码的响应是异常的:

[collectionView reloadData];
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone];
复制代码

异常在于[collectionView reloadData];执行正常,把DataSource的变化展现出来了,可是下面的selectItemAtIndexPath方法却无响应。目标indexPath对应的item没有在被选中状态。


解决方案

后来跟同事讨论,发现在执行[collectionView reloadData];之后,执行selectItemAtIndexPath方法之前,collectionView的UI并没有立即做出变化,故selectItemAtIndexPath是没有被响应的。

最终能响应的代码:

[collectionView reloadData];
[collectionView layoutIfNeeded];
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone];
复制代码

原因

layoutIfNeeded这个方法和另一个方法配对的,setNeedLayoutlayoutIfNeed,还有一个关联的方法是layoutSubviews,在我们没有任何干预的情况下,一个viewframbounds发生变化时,系统会设置一个flag给这个view,当下一个渲染时机到来时系统会重新按新的布局来渲染视图。setNeedLayout就是我们主动为这个视图设置一个flag,告诉系统这个视图再下一个时机到来时要重新渲染,而layoutIfNeed则是告诉系统,如果设置了flag那么不用等待时机到来了,直接渲染吧。而layoutSubviews这个方法是系统调用的,我们不需要主动调用,我们只需要调用layoutIfNeed就可以了,让系统判断是否在当前时机下立即渲染。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值