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 上的专辑封面