最近在修改直播项目出现的问题,需要在直播页面强制进入横屏,记录下遇到的坑,稍后会写一篇阿里云直播的文章.
-
程序单独页面强制改变方向
(横竖屏)
在需要改变屏幕方向的类使用这个方法 (需要设置DeviceOrientation方向)
if([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)]) //判断对象是否响应setOrientation方法
respondsToSelector实例方法,判断对象是否响应某个方法instancesRespondToSelector类方法,判断类是否响应某个方法
{
SEL selector = NSSelectorFromString(@"setOrientation:");
//NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex:
//创建签名函数
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
//设置selector
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
int state = UIInterfaceOrientationLandscapeLeft;//需要设置的状态
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,//垂直,home 键在下
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,//垂直,home 键在上
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,//水平,home 键在右
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft//水平,home 键在左
//atIndex的下标必须从2开始.原因:0 1 两个参数已经被target 和selector占用
[invocation setArgument:&state atIndex:2];
//消息调用
[invocation invoke];
}```
///因为不想改动以前的代码,所以我写了类别来改变屏幕(此处有坑,如果使用UITabBarController也要给UITabBarController的分类添加方法)
///查了资料,只需要自定义 UINavigationController就可以实现强制转向,写demo验证的却如此,但引用到项目不行, 强制转向的类还是会收到感应的影响.排查后发现是因为项目使用了UITabBarController,所以要自定义UITabBarController UINavigationController UIViewController 不想更改项目可写category
//是否允许转向
-(BOOL)shouldAutorotate{
return YES;
}
//支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
//对需要定向的类单独设置
if ([self.visibleViewController isKindOfClass:[configViewController class]]) {
return UIInterfaceOrientationMaskLandscapeLeft;//方向设置
}
return UIInterfaceOrientationMaskPortrait;
}
//如一个页面支持多个方向,这里设置优先方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationLandscapeLeft;
}
但是这并不能解决的遇到的问题,因为直播如果画面横向的话相机方向也会偏向90度并无法调节,设置transform属性旋转90度也会造成相机方向偏移,尝试无果后只好改变思路,横向布局页面,横向布局只需将控件按照方向旋转即可,造成横屏的假象(如果不使用阿里云直播,使用上面的方法即可)
阿里云直播如果需要做横竖屏的话,要根据当前手机的感应状态来做相应的适配,这是很坑的一点
判断手机的感应方向(伪横竖屏切换,只需要设置DeviceOrientation为Portrait)
//监听手机方向改变
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
//此处对相应的状态做处理
- (void)handleDeviceOrientationDidChange:(UIInterfaceOrientation)interfaceOrientation
{
UIDevice *device = [UIDevice currentDevice] ;
switch (device.orientation) {
case UIDeviceOrientationFaceUp:
NSLog(@"屏幕朝上平躺");
break;
case UIDeviceOrientationFaceDown:
NSLog(@"屏幕朝下平躺");
break;
case UIDeviceOrientationUnknown:
NSLog(@"未知方向");
break;
case UIDeviceOrientationLandscapeLeft: {
NSLog(@"屏幕向左横置");
}
break;
case UIDeviceOrientationLandscapeRight:
NSLog(@"屏幕向右横置");
break;
case UIDeviceOrientationPortrait:
{ NSLog(@"屏幕直立");
}
break;
case UIDeviceOrientationPortraitUpsideDown:
NSLog(@" 屏幕直立 上下颠倒");
break;
default: NSLog(@"无法辨认");
break;
}
}
//销毁通知
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
以上是我对横竖屏切换的一些见解,欢迎大家一起讨论.