MPMoviePlayerController添加UIButton以查看与控件淡化

Jon*_*n C 3 objective-c mpmovieplayercontroller ipad ios4

我试图将UIButton添加到MPMoviePlayerController的视图以及标准控件.按钮出现在视频上方并按预期接收触摸事件,但我希望它能够使用标准控件淡入淡出以响应用户触摸.

我知道我可以通过滚动我自己的自定义播放器控件来实现这一点,但它似乎很愚蠢,因为我只是想添加一个按钮.

编辑

如果以递归方式遍历MPMoviePlayerController视图的视图层次结构,最终将进入名为MPInlineVideoOverlay的视图类.您可以轻松地向此视图添加任何其他控件,以实现自动淡入/淡出行为.

虽然有一些问题,但是在创建MPMoviePlayerController并将其添加到视图之前,它有时需要一段时间(根据我的经验可达一秒),然后才能完全初始化并创建它的MPInlineVideoOverlay层.因此,我必须在下面的代码中创建一个名为controlView的实例变量,因为有时它在运行此代码时不存在.这就是为什么我有最后一段代码,如果找不到该函数,它会在0.1秒内再次调用自身.尽管有这种延迟,我还是没有注意到我的界面上出现按钮的任何延迟.

-(void)setupAdditionalControls {
    //Call after you have initialized your MPMoviePlayerController (probably viewDidLoad)
    controlView = nil;
    [self recursiveViewTraversal:movie.view counter:0];

    //check to see if we found it, if we didn't we need to do it again in 0.1 seconds
    if(controlView) {
            UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
            [controlView addSubview:backButton];
    } else {
            [self performSelector:@selector(setupAdditionalControls) withObject:nil afterDelay:0.1];
    }
}


-(void)recursiveViewTraversal:(UIView*)view counter:(int)counter {
    NSLog(@"Depth %d - %@", counter, view); //For debug
    if([view isKindOfClass:NSClassFromString(@"MPInlineVideoOverlay")]) {
            //Add any additional controls you want to have fade with the standard controls here
            controlView = view;
    } else {
            for(UIView *child in [view subviews]) {
                    [self recursiveViewTraversal:child counter:counter+1];
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是最好的解决方案,但我发布它以防其他人试图做同样的事情.如果Apple要更改控件叠加层内部的视图结构或类名,它将会中断.我也假设你没有全屏播放视频(虽然你可以用嵌入式控件全屏播放).我还必须使用此处描述的技术禁用全屏按钮,因为MPInlineVideoOverlay视图在按下时会被删除并释放:iPad MPMoviePlayerController - 禁用全屏

当您收到上述全屏通知时调用setupAdditionalControls会将其他控件重新添加到UI.

如果有人能提出除了我提出的这个hackery之外的东西,我会喜欢更优雅的解决方案.

Mar*_*nny 5

我对同一问题的解决方案是:

  • 添加按钮作为MPMoviePlayerController视图的子项;
  • 使用其alpha属性的动画淡入和淡出按钮,具有适当的持续时间;
  • 处理播放器控制器touchesBegan,并使用它来切换按钮的可见性(使用其alpha);
  • 使用计时器确定何时再次隐藏按钮.

通过反复试验,我确定匹配(当前)iOS的持续时间是:

  • 淡入:0.1秒
  • 淡出:0.2秒
  • 屏幕上的持续时间:5.0s(每次触摸视图时延伸)

当然这仍然很脆弱; 如果内置延迟发生变化,我的看起来会出错,但代码仍会运行.

  • 对于iOS 7,相关的类名已更改为"MPVideoPlaybackOverlayView",要观察的属性为"hidden",因为"alpha"不再更改. (2认同)