当“awakeFromNib”运行时,UICollectionViewCell 内的动画不会运行。
Posted
技术标签:
【中文标题】当“awakeFromNib”运行时,UICollectionViewCell 内的动画不会运行。【英文标题】:Animation inside UICollectionViewCell doesn't run when "awakeFromNib" runs. 【发布时间】:2015-03-09 09:02:08 【问题描述】:我正在开发一个带有 Cell 的 UICollectionViewController,其中包含在显示时动画的内部“UIView”(只是一个简单的 y 轴移动)。
我的问题是,首先从 nib 文件加载单元格,动画不运行,但单元格被“重用”,动画正在运行。
这就是我的工作:
- (void)loadCellWithAnimation
CGRect prevRect = self.viewThatAnimates.frame;
prevRect.origin.y = prevRect.origin.y+10;
[UIView animatewithDuration:0.5f animations:^self.viewThatAnimates.frame = prevRect];
在我的 collectionViewController 上:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
[cell loadCellWithAnimation];
return cell;
正如我所说,“重用”动画效果很好,但从笔尖唤醒时它不会运行。
我已经在几种不同的情况下对此进行了测试,结果始终相同。
感谢您的帮助;)
【问题讨论】:
一点点补充,当我运行动画块有一点延迟(dispatch_after 有 0.05 秒延迟)时,动画可以运行 【参考方案1】:因为直到
return cell;
已从您的委托方法调用,awakeFromNib
未被调用。
你可以试试动画
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
希望它有效。
干杯。
【讨论】:
当我尝试使用这个部分时,发生了 2 件奇怪的事情。第一个是这个委托方法被称为异步,并且在调用“awakeFromNib”时经过长时间延迟(大约 2-3 秒),第二个是我有一个我在我的 collectionviewCells 中使用的对象数组,这个数组大小是“0 “在“didEndDisplayingCell”方法中,但在“cellForIndexPath”方法中看起来很完整。我猜“didDisplayCell”方法的线程在数组生成之前被异步调用,但它仍然很奇怪。 将动画与单元初始化和其他内容分开。 2-3 秒是很长的时间,但它会立即调用。如果您的应用使用 ios>=8.0,您可以尝试使用 willDisplayMethod 进行动画处理,这也可能对您有用。 如果有帮助,您可以查看此链接aplus.rs/2014/how-to-animate-in-uicollectionview-items。 来自collectionView didEndDisplayingCell:
的参考:“使用此方法检测单元格何时从集合视图中删除,而不是监视视图本身以查看它何时消失”(developer.apple.com/library/ios/documentation/UIKit/Reference/…)
以上是关于当“awakeFromNib”运行时,UICollectionViewCell 内的动画不会运行。的主要内容,如果未能解决你的问题,请参考以下文章
awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次
awakeFromNib 返回 Null UILabel 值