全局禁止横屏,但视频播放界面选择性横屏,以及引发问题的解决办法

    xiaoxiao2021-04-16  38

    有时我们的APP并没有适配横屏的需求,但是在个别视频播放界面,我们需要在播放视频的时候横屏,退出全屏的时候不能横屏,但是有时候并没有原生API并没有给出解决方案。

    网上给出的解决办法:

    在 APPDelegate.h 文件中增加属性:是否支持横屏

    /*** 是否允许横屏的标记 */ @property (nonatomic,assign)BOOL allowRotation;

    在 APPDelegate.m 文件中增加方法,控制全部不支持横屏

    - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (self.allowRotation) { return UIInterfaceOrientationMaskAllButUpsideDown; } return UIInterfaceOrientationMaskPortrait; }

    这样在其他界面想要横屏的时候,我们只要控制 allowRotation 这个属性就可以控制其他界面进行横屏了。

    //需在上面#import "AppDelegate.h" AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.allowRotation = YES; //不让横屏的时候 appDelegate.allowRotation = NO;即可

    播放界面横屏

    所以这里可以使用 UIWindow 的通知,就可以解决

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(begainFullScreen) name:UIWindowDidBecomeVisibleNotification object:nil];//进入全屏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endFullScreen) name:UIWindowDidBecomeHiddenNotification object:nil];//退出全屏

    在退出全屏时,增加逻辑让其强制编程竖屏,这样当全屏播放的时候,点击 down("完成") 时,就会自动变成竖屏了。

    // 进入全屏 -(void)begainFullScreen { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.allowRotation = YES; } // 退出全屏 -(void)endFullScreen { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.allowRotation = NO; //强制归正: if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { SEL selector = NSSelectorFromString(@"setOrientation:"); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]]; [invocation setSelector:selector]; [invocation setTarget:[UIDevice currentDevice]]; int val =UIInterfaceOrientationPortrait; [invocation setArgument:&val atIndex:2]; [invocation invoke]; } }

    但是依旧会出现很多问题,而且网上一大堆全是如是不变的解决办法,对于这些复制粘贴,真是浪费时间,浪费感情。

    按照上面的方法,确实会解决当前的问题,但是会引发更多的问题,而且有些问题很难解决。

    第一,横屏退出播放后,状态栏不见了,整个APP的状态栏不见了

    第二,如果项目中引入即时通讯,账号被踢,视频依旧处于播放状态,还可以继续播放,这显然是不合理的。而且还退出不了。至少我没有找到这方面的解决办法,当然可能原生控制的话比较方便吧,但是我们项目中这个模块是由html实现的,没办法时间比较急。

    第三,我可能找到了更好的方法

    它是由两块window来实现的,视频播放器是用一个新的window来实现的。这样的话,便有了一个新的思路,根据判断window,来解决横竖屏的问题

    在APP delegate中:

    但是这么写,也有一些问题,横屏退出播放后,状态栏不见了,但是其他页面没有问题

    解决方法:在对应页面添加退出window的通知,其实最上面的解决办法也是基于监听新window出现和消失来处理的。

    到这里,如果没有引入即时通讯,就结束了。

    再来说一说即时通讯被踢的解决办法

    通过监听即时通讯被踢的通知,实现方法,原本就在APP delegate中有这个方法,因为需要跳到登录页。

    解决办法:移除视频播放器所在的window,并让页面所在window成为主window,显示出来

    上面红框中的很重要,否则登录页会出现半横屏的状况。

    这样视频的window是不见了,但是,你会发现又有一个问题,他还有声音,好坑爹啊。

    那么,直接上解决办法:

    监听被踢事件,重载webview,就解决了。代码上图已有。至于原因,。。。呵呵哒

    如果有新的理解,欢迎来讨论。本人邮箱:253190024@qq.com

    转载请注明原文地址: https://ju.6miu.com/read-672063.html

    最新回复(0)