我正在尝试将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 会将其他控件重新添加到用户界面。
如果有人能提出除了我提出的这个hackery之外的其他内容,我会喜欢更优雅的解决方案。
答案 0 :(得分:5)
我对同一问题的解决方案是:
alpha
属性的动画以适当的持续时间淡入淡出按钮; touchesBegan
,并使用它来切换按钮的可见性(使用其alpha); 通过反复试验,我确定与(当前)iOS相匹配的持续时间为:
当然这仍然很脆弱;如果内置延迟发生变化,我的看起来会出错,但代码仍会运行。