我正在尝试将 UIButton 添加到MP电影播放器控制器以及标准控件。该按钮出现在视频上,并按预期接收触摸事件,但我希望它使用标准控件淡入和淡出,以响应用户触摸。
我知道我可以通过滚动自己的自定义播放器控件来实现这一目标,但这似乎很愚蠢,因为我只是想添加一个按钮。
EDIT
如果递归遍历视图层次结构MP电影播放器控制器的视图最终你会来到一个名为的视图类MP内联视频叠加。您可以轻松地向此视图添加任何附加控件,以实现自动淡入/淡出行为。
不过,有一些问题,创建后有时可能需要一段时间(根据我的经验最多一秒钟)MP电影播放器控制器并在完全初始化并创建它之前将其添加到视图中MP内联视频叠加层。因此我必须创建一个名为的实例变量控制视图在下面的代码中,因为有时该代码运行时它不存在。这就是为什么我有最后一段代码,如果没有找到函数,它会在 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];
}
}
}
这不是最好的解决方案,但我将其发布,以防其他人尝试做同样的事情。如果苹果要改变控制覆盖层内部的视图结构或类名,它就会崩溃。我还假设您没有全屏播放视频(尽管您可以使用嵌入式控件全屏播放视频)。我还必须使用此处描述的技术禁用全屏按钮,因为MP内联视频叠加视图在按下时被移除并释放:iPad MPMoviePlayerController - 禁用全屏
Calling 设置附加控件当您收到上述全屏通知时,会将您的附加控件重新添加到 UI。
如果有人能提出除了我提出的这个黑客之外的其他建议,我会喜欢一个更优雅的解决方案。