iPad MPMoviePlayerController - 禁用全屏

14

有没有一种方法可以禁用MPMoviePlayerController的全屏按钮?

16个回答

11

刚刚完成了:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(movieEventFullscreenHandler:) 
                                                 name:MPMoviePlayerWillEnterFullscreenNotification 
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(movieEventFullscreenHandler:) 
                                                 name:MPMoviePlayerDidEnterFullscreenNotification 
                                               object:nil];

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
}

- (void)movieEventFullscreenHandler:(NSNotification*)notification {
    [self.moviePlayer setFullscreen:NO animated:NO];
    [self.moviePlayer setControlStyle:MPMovieControlStyleEmbedded];
}

4
好主意,我认为我可以使用这个来触发一个警报,解释为什么当前上下文中不允许全屏,并强制它保持嵌入模式。不幸的是,实际发生的是,您仍然会进入全屏模式,然后又回到嵌入模式,这看起来非常糟糕。 - Roger
我刚试过这个,但不幸的是全屏忽略了MPMovieControlStyleEmbedded并使用全屏模式,当我切换全屏时,它变得更大:( - lordB8r

7

根据您的需求,您还可以在播放器视图上禁用所有用户交互。

player.view.userInteractionEnabled = NO;

6

您可以将controlStyle设置为Fullscreen。这些控件略有不同,但没有全屏按钮!

[_moviePlayerController setControlStyle:MPMovieControlStyleFullscreen];

天才!这绝对是最好的答案。 - PICyourBrain

5
你可以隐藏播放控件并添加自定义的控件,这将防止默认按钮被渲染出来。
例如:使用以下代码:
[player setMovieControlMode:MPMovieControlModeNone];

5
很不幸,以上方法都没有很好地解决我的问题,因此我选择了以下方法(并且成功地实现了):
1.隐藏全屏按钮。
在初始化电影播放器的方法中添加以下代码:
``` // 因为我们必须等到控制器出现才能执行
[self performSelector:@selector(hideFullscreenButton) withObject:self afterDelay:0.5]; ```
增加以下两个方法:
``` -(void)hideFullscreenButton{ // 隐藏全屏模式按钮 [self hideFullscreenSubview:movieClip.view.subviews]; }
-(void)hideFullscreenSubview:(NSArray *)arr{ for(UIView *v in arr){ if([v.subviews count]>0) [self hideFullscreenSubview:v.subviews]; else NSLog(@"%@",v); if(v.frame.origin.x==975 ){ v.hidden=TRUE; } } } ```
问题是没有标签可用于识别哪个视图需要隐藏。在我的情况下,根据视图坐标,我找出了需要隐藏的视图。
2.重写点击手势,以防止全屏放大缩小。
``` movieClip.controlStyle = MPMovieControlStyleEmbedded;
// 禁用点击手势,以免视频控件设置为全屏模式。 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)]; singleTap.numberOfTapsRequired = 1; [movieClip.view addGestureRecognizer:singleTap];
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)]; doubleTap.numberOfTapsRequired = 2; [movieClip.view addGestureRecognizer:doubleTap]; [singleTap requireGestureRecognizerToFail:doubleTap]; ```
并添加以下选择器方法:
``` -(void)doSingleTap{ // 什么也不做!!! }
-(void)doDoubleTap{ // 什么也不做!!! } ```

第一种解决方案对我来说完美无缺,谢谢!在底部是Swift版本。 - diegomen
它隐藏了滑块,而不是全屏按钮。 - Rahul Vyas

4

有一个作弊方法:

MPMoviePlayerController *mpc = (...some instance...)
UIView *fsbutton = [[mpc view] viewWithTag:512];
[fsbutton setHidden:YES];

主要注意的是,在viewDidAppear:或类似的方法中进行操作,因为MoviePlayer视图会在didMoveToWindowdidMoveToSuperview方法中设置自己,这些方法会在viewWillAppear:之后执行。所以您将看到全屏按钮的短暂闪现。其他明显的问题包括:易受损(尽管在3.2-4.2版本中可以使用)与苹果可能更改512标记值;当然,苹果不希望您这样做。
官方推荐的解决方案是将控制样式设置为MPMovieControlStyleNone并编写自己的传输控件,这需要更多的工作。

1
另一个问题是,捏合缩放手势也会将用户带入全屏模式,从而规避了这个巧妙的想法。 - Roger
and try to remove gestures - Volodymyr B.
1
如果您尝试修改MPMovePlayerController的公共API之外的内容,Apple可能会拒绝您的应用程序。以下是Apple文档中的一句话: “将电影播放器视图视为不透明结构。您可以添加自己的自定义子视图以在电影上层添加内容,但绝不能修改其现有子视图之一。” - n8tr

3

为了禁用全屏模式的切换,无论是通过按钮还是捏合手势,您可以使用以下代码:

moviePlayer.controlStyle = MPMovieControlStyleNone;
moviePlayer.view.userInteractionEnabled =NO; 

3
不好意思,目前没有办法。希望能在下一个更新中解决这个问题。

2

全屏按钮以及暂停按钮可以被移除。

[self.videoPlayer setControlStyle:MPMovieControlStyleNone];

2

这在iOS 7和iPhone 5s上可行。

Add Notification:

MPMoviePlayerDidEnterFullscreenNotification : @"moviePlayFullscreenNote:"

- (void)moviePlayFullscreenNote:(NSNotification*)notification
{
    if (notification.object == self.videoPlayer)
    {
        [self.videoPlayer setFullscreen:NO animated:YES];
        self.videoPlayer.controlStyle = MPMovieControlStyleEmbedded;
    }
}

请注意,我只监听“DID”而不是“WILL”通知,并且以动画方式运行它。我认为这样做可以给系统反应的时间。当我像上面的答案中所述使用“WILL”和“DID”时,会导致黑屏且没有控件。在转换发生时可见轻微故障,但我需要来自嵌入式播放/切换按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接