MPMoviePlayerController 添加 UIButton 以查看淡入淡出的控件

Posted

技术标签:

【中文标题】MPMoviePlayerController 添加 UIButton 以查看淡入淡出的控件【英文标题】:MPMoviePlayerController adding UIButton to view that fades with controls 【发布时间】:2011-05-24 16:32:46 【问题描述】:

我正在尝试将 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];
            
    

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

当您收到上述全屏通知时调用 setupAdditionalControls 会将您的附加控件重新添加到 UI。

如果有人能提出我想出的这个黑客以外的建议,我会喜欢一个更优雅的解决方案。

【问题讨论】:

对于 iPhone 5,不要查找“MPInlineVideoOverlay”类,而是尝试查找“MPFullScreenTransportControls”类 【参考方案1】:

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

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

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

淡入:0.1s 淡出:0.2s 屏幕持续时间:5.0s(每次触摸视图时延长)

当然,这仍然是脆弱的;如果内置延迟发生变化,我的会看起来不对,但代码仍然会运行。

【讨论】:

谢谢,这应该可行,我认为 Apple 更改淡入淡出持续时间的可能性远低于更改视图结构。会和这个一起去的。 你能举一些例子,你是如何处理touchedBegan的吗?播放器不是 UIVIew,因此无法对其进行子类化。还有当方向改变时如何替换按钮? @JoãoNunes 使用 MPMoviePlayerViewController 代替并将其子类化并使用它的 moviePlayer 属性来播放电影。至于方向变化,你得重新计算按钮的CGRect 对于 iOS 7,相关的类名称已更改为 MPVideoPlaybackOverlayView,要观察的属性为 hidden,因为 alpha 不再更改。

以上是关于MPMoviePlayerController 添加 UIButton 以查看淡入淡出的控件的主要内容,如果未能解决你的问题,请参考以下文章

MPMoviePlayerController 不播放 .wmv

如何显示 MPMoviePlayerController 控件?

MPMoviePlayerController 隐藏 AirPlay 按钮

MPMoviePlayerController 上的专辑封面

MPMoviePlayerController 已弃用,现在怎么办?

用 MPMoviePlayerController 替换 AVPlayer