我有一个ICarousel正确显示我的所有视频,但是当我按下播放按钮时,它将播放下一个索引上的视频而不是我正在使用的索引。
我希望它能够在指定的索引处播放,我尝试将[sender tag]
作为索引传递,并尝试使用相应的播放项在该索引处创建另一个子视图。
似乎什么都没有用,这是什么原因?!!
这是我的viewForItemAtIndex
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:[_videoURLS objectAtIndex:index]] options:nil];
//Video Player View
_videoView = [[UIView alloc] initWithFrame:CGRectMake(0,0, mainViewWidth, 220)];
_videoView.backgroundColor = [UIColor colorWithRed:123/255.0 green:123/255.0 blue:123/255.0 alpha:1.0];
_videoView.center = CGPointMake(100, 170);//170
_videoView.tag = 20;
[view addSubview:_videoView];
//Play Button
_playButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60.0f, 60.0f)];
[_playButton setBackgroundImage:[UIImage imageNamed:@"play-icon-grey.png"] forState:UIControlStateNormal];
[_playButton addTarget:self action:@selector(playVideo:) forControlEvents:UIControlEventTouchUpInside];
_playButton.center = CGPointMake(100, 160);
_playButton.tag = index;
[view addSubview:_playButton];
//AV Asset Player
AVPlayerItem * playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
_player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
playerLayer.frame = _videoView.bounds;
// [playerLayer setFrame:_videoView.frame];
[_videoView.layer addSublayer:playerLayer];
[_player seekToTime:kCMTimeZero];
return view;
}
这会显示甚至播放,但它不会播放当时专注的正确播放。 我已经被困在这几天了,任何帮助都表示赞赏!!
答案 0 :(得分:0)
您可以使用playVideo方法更新代码吗?可能是这个方法的问题。检查从这个方法中选择的url是否与我们在index中的视图中返回的url相同。!!
答案 1 :(得分:0)
首先,如果可能,我会使用- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
代替按钮。第二 - 你没有重复使用视图并且总是创建新的(并且你总是为视图设置相同的标签,这可能是播放错误视频的原因),这样性能可能会受到影响。
我会做什么:
- 创建UIView子类(使用xib文件或以编程方式创建的接口 - 这是您环境中的首选项和/或标准问题),创建公共方法,如- (void)configureWithAsset:(AVURLAsset *)asset
或- (void)configureWithURL:(NSURL *)url
,并在此方法中传递所需信息。在实现中,您应该使用所需的视频初始化AVPlayer。
在- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
中调用此方法(您可以将UIView更改为您的自定义子类名称,因此您不需要强制转换) - 就像这样
- (VideoView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(VideoView *)view
{
if (view == nil) {
view = [VideoView new]; // you may need to create another initializer
}
NSURL *url = get URL here;
[view configureWithURL:url];
return view;
}
然后当你需要播放视频时,请拨打[videoView playVideo]
(你也需要创建它,它应该只调用播放器对象上的播放)。
答案 2 :(得分:0)
与创建iCarousel的人取得联系后,我找到了解决方案。
只需在selctedItemAtIndex中而不是在主视图中创建AVPlayer图层。 这允许我使用
_carousel.currentItemView && _carousel.currentItemAtIndex
将图层分配给特定轮播视图的子视频视图