如何去除 UIView transitionWithView 的效果
How to remove the effects of UIView transitionWithView
使用下面的代码,我已经成功地使我的 UIImageView 在其图像中淡出。
[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myCell.myImageView.image = myImage;
} completion:NULL];
但是,当重新使用单元格时,我需要删除此图像。
重复使用时,它会显示最后一张图像(在重复使用之前显示),然后过渡到它应该是的图像,而不是从没有图像过渡到它应该是的图像。
我尝试过的:
-(void)prepareForReuse {
[super prepareForReuse];
// More is obviously needed than just setting image to nil when using a transition
self.myImageView.image = nil;
[self.myImageView setNeedsDisplay];
// but I also tried removing all animations
[self.myImageView.layer removeAllAnimations];
// and I even tried removing the sublayers, but still no success.
[self.myImageView.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
}
感谢任何帮助,但如果您不明白问题是什么,请不要回答。请发表评论,以便我在需要时更好地解释。
谢谢!
- 尝试使用 [self.myImageView.image setNeedsDisplay];在将图像设置为 nil
之后
- 你不需要移除子层
- 在显示动画之前,最坏的情况是,您可以使用来自 'Cell for row at indexpath'
的选择器调用强制图像视图为 nil
我想发表评论,但丢失了我的旧登录名并改为回答:)
编辑 ------------------ 下面是最新更新
所以我重试了在我的代码中模拟错误,下面是遵循的步骤
1. 使用默认的tableview并尝试淡入自己的imageview(可在cell.imageView获得)
2. 任何没有。与 [UIView transitionWithView..] 的组合对我的情况没有帮助。相反,我在 [cellForRowatIndexPath] 中设置图像(没有过渡),并仅在 [willDisplayCell forRowAtIndexPath]
中使用下面的淡入淡出代码
cell.imageView.alpha = 0;
[UIView beginAnimations:@"fade in" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDuration:2.0];
cell.imageView.alpha = 1.0;
[UIView commitAnimations];
而且效果很好。你能试试这个吗,可能对你有用。
如果您确实需要使用 transitionWithView
,请按以下步骤操作。
首先,将以下函数添加到您的 UITableViewCell
class:
-(void)fadeInImage
{
self.ivPadlock.alpha = 0.0;
// Wait a fraction of a second...
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
// ..then perform the "transitionWithView" on a seperate thread
[UIView transitionWithView:self.ivPadlock duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
// Replace our UIImageView's image with an alternative image
int i = rand()%5;
switch (i)
{
case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
}
self.ivPadlock.alpha = 1.0;
} completion:NULL];
});
}
然后,确保在创建或重新使用单元格时调用此函数:
- (void)awakeFromNib {
// Initialization code
[self fadeInImage];
}
-(void)prepareForReuse
{
[super prepareForReuse];
[self fadeInImage];
}
顺便说一句,因为您希望始终从 "nothing" 过渡到新图像,使用 animateWithDuration
将图像淡入您的单元格不会让生活更轻松吗?
-(void)prepareForReuse
{
[super prepareForReuse];
self.ivPadlock.alpha = 0.0;
self.ivPadlock.hidden = false;
int i = rand()%5;
switch (i)
{
case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
}
[UIView animateWithDuration:2.0 animations:^{
self.ivPadlock.alpha = 1.0;
}];
}
希望这对您有所帮助。
您可以利用回调
tableView:didEndDisplayingCell:forRowAtIndexPath:
这就是当单元格超出可见区域时调用的。
尝试在此处将图像设置为无图像或无图像。应该可以。
[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myCell.myImageView.image = myImage;
} completion:^(BOOL finished) {
[self.myImageView.layer removeAllAnimations];
}];
就我而言,我尝试用上面的代码解决我的问题。
这可能会解决您的问题。动画序列结束时要执行的块对象(完成)。
试试这个:
-(void)prepareForReuse {
[super prepareForReuse];
[CATransaction begin];
[self.myImageView.layer removeAllAnimations];
self.myImageView.image = nil;
[CATransaction commit];
}
感谢您的尝试,但 none 的答案解决了问题。我也尝试了不同答案的组合。此外,其中 none 个满足 "Looking for an answer drawing from credible and/or official sources."。
我已经联系了 Apple Developer Technical Support,并会在收到他们的回复后编辑此答案,以便对其他人也有帮助。
使用下面的代码,我已经成功地使我的 UIImageView 在其图像中淡出。
[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myCell.myImageView.image = myImage;
} completion:NULL];
但是,当重新使用单元格时,我需要删除此图像。 重复使用时,它会显示最后一张图像(在重复使用之前显示),然后过渡到它应该是的图像,而不是从没有图像过渡到它应该是的图像。
我尝试过的:
-(void)prepareForReuse {
[super prepareForReuse];
// More is obviously needed than just setting image to nil when using a transition
self.myImageView.image = nil;
[self.myImageView setNeedsDisplay];
// but I also tried removing all animations
[self.myImageView.layer removeAllAnimations];
// and I even tried removing the sublayers, but still no success.
[self.myImageView.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
}
感谢任何帮助,但如果您不明白问题是什么,请不要回答。请发表评论,以便我在需要时更好地解释。
谢谢!
- 尝试使用 [self.myImageView.image setNeedsDisplay];在将图像设置为 nil 之后
- 你不需要移除子层
- 在显示动画之前,最坏的情况是,您可以使用来自 'Cell for row at indexpath' 的选择器调用强制图像视图为 nil
我想发表评论,但丢失了我的旧登录名并改为回答:)
编辑 ------------------ 下面是最新更新
所以我重试了在我的代码中模拟错误,下面是遵循的步骤 1. 使用默认的tableview并尝试淡入自己的imageview(可在cell.imageView获得) 2. 任何没有。与 [UIView transitionWithView..] 的组合对我的情况没有帮助。相反,我在 [cellForRowatIndexPath] 中设置图像(没有过渡),并仅在 [willDisplayCell forRowAtIndexPath]
中使用下面的淡入淡出代码cell.imageView.alpha = 0;
[UIView beginAnimations:@"fade in" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDuration:2.0];
cell.imageView.alpha = 1.0;
[UIView commitAnimations];
而且效果很好。你能试试这个吗,可能对你有用。
如果您确实需要使用 transitionWithView
,请按以下步骤操作。
首先,将以下函数添加到您的 UITableViewCell
class:
-(void)fadeInImage
{
self.ivPadlock.alpha = 0.0;
// Wait a fraction of a second...
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
// ..then perform the "transitionWithView" on a seperate thread
[UIView transitionWithView:self.ivPadlock duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
// Replace our UIImageView's image with an alternative image
int i = rand()%5;
switch (i)
{
case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
}
self.ivPadlock.alpha = 1.0;
} completion:NULL];
});
}
然后,确保在创建或重新使用单元格时调用此函数:
- (void)awakeFromNib {
// Initialization code
[self fadeInImage];
}
-(void)prepareForReuse
{
[super prepareForReuse];
[self fadeInImage];
}
顺便说一句,因为您希望始终从 "nothing" 过渡到新图像,使用 animateWithDuration
将图像淡入您的单元格不会让生活更轻松吗?
-(void)prepareForReuse
{
[super prepareForReuse];
self.ivPadlock.alpha = 0.0;
self.ivPadlock.hidden = false;
int i = rand()%5;
switch (i)
{
case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
}
[UIView animateWithDuration:2.0 animations:^{
self.ivPadlock.alpha = 1.0;
}];
}
希望这对您有所帮助。
您可以利用回调
tableView:didEndDisplayingCell:forRowAtIndexPath:
这就是当单元格超出可见区域时调用的。
尝试在此处将图像设置为无图像或无图像。应该可以。
[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myCell.myImageView.image = myImage;
} completion:^(BOOL finished) {
[self.myImageView.layer removeAllAnimations];
}];
就我而言,我尝试用上面的代码解决我的问题。 这可能会解决您的问题。动画序列结束时要执行的块对象(完成)。
试试这个:
-(void)prepareForReuse {
[super prepareForReuse];
[CATransaction begin];
[self.myImageView.layer removeAllAnimations];
self.myImageView.image = nil;
[CATransaction commit];
}
感谢您的尝试,但 none 的答案解决了问题。我也尝试了不同答案的组合。此外,其中 none 个满足 "Looking for an answer drawing from credible and/or official sources."。 我已经联系了 Apple Developer Technical Support,并会在收到他们的回复后编辑此答案,以便对其他人也有帮助。