当“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 中都有哪些网点?

awakeFromNib 返回 Null UILabel 值

awakeFromNib 中的代码被故事板覆盖

awakeFromNib 被调用,viewDidLoad 未被调用

为啥在使用情节提要时反复调用 AwakeFromNib?