我有一个iOS应用,我试图使用MPMoviePlayerController
显示视频。
代码非常简单,并且在iOS版本大于6.0的所有设备上都能正常运行。
但问题出在iOS 8和8.1上,视频的进度条不可见,如下图所示。
我不明白为什么会发生这种情况,或者是iOS 8的错误。
请建议。 提前谢谢。
答案 0 :(得分:1)
我的应用程序中也有这个问题,它支持多个iOS版本,但这个问题确实只在iOS 8上可见。
我的代码在MPMoviePlayerController
和controlStyle
之间切换MPMovieControlStyleEmbedded
MPMovieControlStyleNone
,这是使用UIDeviceOrientationDidChangeNotification
触发的。我必须承认我以编程方式旋转我的播放器,我不会旋转应用程序;这可能是这个问题的根源。我以纵向显示控件,并将它们隐藏在横向中。
我显然分两步解决了这个问题。我没有在一个简单的应用程序中分离出这个问题,所以如果解决方案对每个人都不准确,我会道歉。
首先,脏的部分,,也许并非每个遇到此问题的人都需要,我会解析一些玩家子视图来照顾MPVideoPlaybackOverlayView
查看,以强制其可见性或隐形。
// Helps to hide or show the controls over the player
// The reason of this method is we are programmatically rotating the player view, while not rotating the application
// On latest iOS, this leads to misbehavior that we have to take into account
-(void)showMPMoviePlayerControls:(BOOL)show
{
self.player.controlStyle = (show ? MPMovieControlStyleEmbedded : MPMovieControlStyleNone);
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8"))
{
// Workaround to avoid persistence of empty control bar
for(UIView *subView in self.player.backgroundView.superview.superview.subviews)
{
if ([subView isKindOfClass:NSClassFromString(@"MPVideoPlaybackOverlayView")]) {
subView.backgroundColor = [UIColor clearColor];
subView.alpha = (show ? 1.0 : 0.0);
subView.hidden = (show ? NO : YES);
}
}
}
}
但这还不够。可能是因为纵向模式有几个方向(UIDeviceOrientationPortrait
,UIDeviceOrientationFaceUp
,...)触发通知,因此控制样式更改请求。
因此,我的修复的第二步是为了处理这样一个事实,即如果我们已经在MPMoviePlayerController
controlStyle
,则无需更改// Set embedded controls only when there is a transition to portrait, i.e. if status bar was hidden
if ([[UIApplication sharedApplication] isStatusBarHidden]) {
[self showMPMoviePlayerControls:YES];
// and we show the status bar here
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
controlStyle
正确的屏幕方向。
就我而言,解决方案是验证状态栏是否隐藏,因为我将其隐藏在横向中:
controlStyle
这里的要点可能是我们不应该设置{{1}},如果它已经设置为所需的值。
由于这解决了我的问题,我停止了我的调查。无论如何,我认为在大多数情况下它可能更简单。当然与{{1}}在错误的时间更改或更改但已经处于通缉状态的事实有关。