ios 的 UIImageView 中显示之前的视频(AVPlayer)而不是 Image
Posted
技术标签:
【中文标题】ios 的 UIImageView 中显示之前的视频(AVPlayer)而不是 Image【英文标题】:Instead of Image, previous video (AVPlayer) is showing up in in UIImageView in ios 【发布时间】:2016-08-09 07:58:39 【问题描述】:我需要您的帮助来为我的应用提供图像/视频。我正在使用 AVPlayer 来显示视频。
一旦显示视频,我在显示图像时遇到问题,以前的视频正在显示在即将到来的图像上。
这是我的代码。 userPostImageStr 中的图片 URL 是正确的,但它仍然显示最后一个视频。
if (userPostVideo != (NSString *)[NSNull null])
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
AVPlayer *player = [[AVPlayer alloc] init];
NSURL *url = [NSURL URLWithString:userPostVideo];
AVURLAsset *asset = [AVURLAsset assetWithURL:url];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
player = [[AVPlayer alloc] initWithPlayerItem:item];
playerViewController.player = player;
[playerViewController.view setFrame:cell.userPostImage.frame];
playerViewController.showsPlaybackControls = NO;
[cell.userPostImage addSubview:playerViewController.view];
[player play];
else if (userPostImageStr != (NSString *)[NSNull null])
if (userPostImageStr != (NSString *)[NSNull null])
[cell.userPostImage setShowActivityIndicatorView:YES];
[cell.userPostImage setIndicatorStyle:UIActivityIndicatorViewStyleGray];
[cell.userPostImage sd_setImageWithURL:[NSURL URLWithString:userPostImageStr]
placeholderImage:[UIImage imageNamed:@"appIcon"] options: SDWebImageRefreshCached
completed:^(UIImage image, NSError error, SDImageCacheType cacheType, NSURL *imageURL)
if (image.size.width < cell.contentView.frame.size.width)
// NEED to write the for contraint update at runtime
//[postImageView setConstraintConstant:image.size.width forAttribute:NSLayoutAttributeWidth];
];
else
cell.userPostImage.image = [UIImage imageNamed:@"appIcon"];
如果有人知道这个问题,请回复。
谢谢。
【问题讨论】:
【参考方案1】:问题是您将包含播放器的子视图添加到单元格中,而没有删除子视图。这就是你打电话时发生的事情
[cell.userPostImage addSubview:playerViewController.view];
当单元格被重用时,之前添加的视图仍然存在并导致各种意外行为。
在添加子视图之前,您应该通过调用删除现有视图
[theViewToBeRemoved removeFromSuperView];
这要求您保留对视图的引用。一种方法是在视图上设置标签。例如:
// Set the tag on the view.
playerViewController.view.tag = 1000;
// Remove the view with the matching tag.
[[cell.userPostImage viewWithTag:1000] removeFromSuperView];
我还建议将播放器作为单元子类中的一个属性,以保持一切井井有条。
【讨论】:
当控件进入“其他”部分时,即显示图像但不显示视频时,就会出现问题。另外,我试过这个。但我仍然面临同样的问题。 我明白了。如果您仔细跟踪每个单元格的视图层次结构,我相信您将能够找到问题所在。您只需要确保所有应该存在的视图都存在。如果存在不应该存在的视图,则必须确定它们的来源。 嗯...好的,谢谢@Daniel 的宝贵时间。以上是关于ios 的 UIImageView 中显示之前的视频(AVPlayer)而不是 Image的主要内容,如果未能解决你的问题,请参考以下文章
appDelegate 中的 UIImageView 显示在模拟器中,但不在设备上
ios StoryBoard - UIImageView 的子类显示为 UIImageView 而不是 IBOutlet 变量中的子类
MPMediaItemPropertyArtwork 未在 UIImageView (iOS 8) 中显示,其他 MPMediaItems 未更新