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的主要内容,如果未能解决你的问题,请参考以下文章

iOS:图像在 UIImageView 中无法正确显示

在 UIImageView 中显示之前裁剪图像

IOS中UIButton和UIImageView的区别

appDelegate 中的 UIImageView 显示在模拟器中,但不在设备上

ios StoryBoard - UIImageView 的子类显示为 UIImageView 而不是 IBOutlet 变量中的子类

MPMediaItemPropertyArtwork 未在 UIImageView (iOS 8) 中显示,其他 MPMediaItems 未更新