您的位置:首页 > 其它

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

2017-04-14 11:08 543 查看
有时我们的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐