UICollectionViewCell 中 UILabel 的 UIView 动画块不起作用

UIView animation block for UILabel in UICollectionViewCell not working

我有自定义 collectionview 单元格(项目)。我每一项都有很多UILabels。根据来自服务器的数据,我想适当地更新标签。通过重新加载相应的项目来更新数据工作正常。代码:

 isUpdate = YES;
 [_collectionView performBatchUpdates:^{
                    [_collectionView reloadItemsAtIndexPaths:bufferUpdateRow];
                } completion:^(BOOL finished) {}];

cellForItemAtIndexPath方法中,我检查变化,如果有变化,我想使用动画块,但似乎不起作用。

-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *cellID = @"CellID";

    CollectionViewCell *cell = (CollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

// Update label content here

  if (isUpdate) {
        _label1.layer.backgroundColor = [UIColor redColor];
        [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^(void) {
                _label1.layer.backgroundColor=[UIColor clearColor].CGColor;
        } completion:nil];

        isUpdate = NO;
  }
  return cell;
}

标签没有像我想要的那样闪烁红色。相反,它只是保持清晰。如果我删除动画块,标签会变成红色(这表明更新检测工作正常)。请帮忙

这可能是因为您在 cellForRowAtIndexPath 方法中创建动画。此方法仅用于初始化单元格并设置其数据,而不是为其设置动画。

您将有更好的机会实施 UITableViewDelegate 并将代码放入其中:

func tableView(tableView: UITableView, willDisplayCell: UITableViewCell, forRowAtIndexPath: NSIndexPath)

确保显示红色背景,然后再将其设置为清除。实现此目的的一种方法是将动画放置在另一个动画的完成块中:

[UIView animateWithDuration:0.0 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^(void) {
     self.view.layer.backgroundColor = [UIColor redColor].CGColor;
} completion:^(BOOL finished) {
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^(void) {
        self.view.layer.backgroundColor=[UIColor clearColor].CGColor;
    } completion:nil];
}];

我也跌倒了issue.but可能是坏了...

我正在研究 iOS14。

  1. 在 collectionViewCell 中你可以调用动画
  2. 我错过了 self.layoutIfNeeded()

(在 5 月的示例中,我在右侧显示了一个红色标签)

final func showSwipeToDeleteAnimated(){
    let W = self.frame.width
    
    UIView.animate(withDuration: 1, delay: 0.3, options: []) {
        self.redSwipeToDeleteViewViewWidthConstraint.constant = W
        self.layoutIfNeeded()
    } completion: { (_) in
        
    }
}