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。
- 在 collectionViewCell 中你可以调用动画
- 我错过了 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
}
}
我有自定义 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。
- 在 collectionViewCell 中你可以调用动画
- 我错过了 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
}
}