iOS屏幕旋转的解决⽅案
这段时间在做跟视频有关的⼯作,视频嘛,肯定不是⼩窗⼝播放,在⼿机上播放视频肯定就是最⼤屏幕利⽤率啦,这就会⽤到全屏播放--也就是旋
转屏幕。
下⾯我就来介绍下我⾃⼰的解决⽅案:
先说⼀个别我在⽹上查到的资料,这⾥给⼤家更正⼀个问题就是要设置app的横屏还是竖屏在Xcode⾥⾯有很多设置的
系统⽀持横屏顺序
applicationwindow设置
默认读取plist⾥⾯设置的⽅向(优先级最⾼)等同于XcodeGeneal设置⾥⾯勾选
然后是UINavigationcontroller
级别最低的是viewcontroller
知道了这个顺序做横屏就变得很容易了
application⽀持所有
-(NSUInteger)application:(UIApplication*)applicationsupportedInterfaceOrientationsForWindow:(UIWindow*)window{
returnUIInterfaceOrientationMaskAll;//⽀持所有⽅向
}
UINavigationcontroller⽀持竖屏
-(BOOL)shouldAutorotate//是否⽀持旋转屏幕{
returnYES;
}
-(NSUInteger)supportedInterfaceOrientations//⽀持哪些⽅向{
returnUIInterfaceOrientationMaskPortrait;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPrentation//默认显⽰的⽅向{
returnUIInterfaceOrientationPortrait;
}
viewcontroller⽀持横屏(pushmodel出来)
-(BOOL)shouldAutorotate//是否⽀持旋转屏幕{
returnYES;
}
-(NSUInteger)supportedInterfaceOrientations//⽀持哪些⽅向{
returnUIInterfaceOrientationMaskLandscape;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPrentation//默认显⽰的⽅向{
returnUIInterfaceOrientationLandscapeLeft;
}
说明⼀点,只要在plist或者General设置了⽀持的⽅向
表⽰其界⾯⽀持的⾃动旋转的⽅向
所以想要旋转屏幕,必须让你的⼯程⽀持所旋转的⽅向。(但是这⾥还有⼀种⽅式是把当前控制器的View或者做transform旋转,但
是我认为这并不是真正的旋转屏幕,⼀点可以证明的就是:状态条并不随着旋转)
其实这个优先级跟你的window的rootViewcontroller有关系,如果rootViewcontroller是UITabbarViewontroller,那么tabbar就类似前⾯所说
的UINavigationcontroller,在iOS6之后好多⽅法发⽣了改变,之前的⼀个屏幕旋转的⽅法就失效了,更改位上⾯的⽅法。
其实屏幕旋转在⼿机⾥⾯有设置,上拉菜单就会有关闭屏幕旋转的⽅式,但是⼤家都知道好多应⽤在关闭屏幕旋转的时候也可以进⾏屏幕旋转---
通过某⼀个按钮的事件来触发,这就是强制旋转(前提依然是你的⼯程设置⽀持你所要旋转的⽅向)
⼀般的不需要旋转的程序只需要勾选第⼀个就可以了。
由于软件需要我勾选的是第⼀个和第四个,在Coding之前我要告诉⼤家⼀个细节:在iOS8之后,屏幕旋转到横向的时候,状态条就会默认隐藏,
我觉得苹果是默认让你获得最⼤的显⽰区域,但是对于我这个轻微强迫症的⼈来说,横屏也要显⽰状态条,以为看着那个绿⾊的电池⽐较舒服
(O(∩_∩)O),具体的操作⽅法就是:
在⽂件中将
Viewcontroller-badstatusbarappearance
设置为
NO
在
application:didFinishLaunchingWithOptions:
中添加下⾯代码
[[UIApplicationsharedApplication]tStatusBarHidden:YESwithAnimation:UIStatusBarAnimationNone];
[[UIApplicationsharedApplication]tStatusBarHidden:NOwithAnimation:UIStatusBarAnimationNone];
如此之后你就会发现消失的状态条有乖乖的回来了。
接下来就是Coding了:
翻阅各⼤⽹站和论坛我总结了好⼏种⽅式,但是⼤同⼩异的旋转屏幕的代码,以供参考:
⽀持ARC版本:(这个⽅法可以使⽤,并且可以通过苹果的审核,已经有⼈使⽤并审核通过了)
if([[UIDevicecurrentDevice]respondsToSelector:@lector(tOrientation:)]){
SELlector=NSSelectorFromString(@"tOrientation:");
NSInvocation*invocation=[NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:lector]];
[invocationtSelector:lector];
[invocationtTarget:[UIDevicecurrentDevice]];
intval=UIInterfaceOrientationLandscapeRight;//这⾥可以改变旋转的⽅向
[invocationtArgument:&valatIndex:2];
[invocationinvoke];
}
或者
//但是注意这个⽅法必须在general⾥⾯设置⽀持锁旋转的⽅向,否则就是强⾏旋转,会导致程序崩溃,⽽且不会有崩溃⽇志,很难发现崩溃在哪⾥,所以使⽤这个⽅法的时候⼀定
[[UIDevicecurrentDevice]tValue:[NSNumbernumberWithInteger:UIDeviceOrientationPortrait]forKey:@"orientation"];
不⽀持ARC版本
if([[UIDevicecurrentDevice]respondsToSelector:@lector(tOrientation:)]){
[[UIDevicecurrentDevice]performSelector:@lector(tOrientation:)
withObject:(id)UIInterfaceOrientationLandscapeRight];
}
还有⼀点就是如何判断当前屏幕的⽅向:可以根据电源的现实⽅向来判断,苹果提供了这⼀⽅法
NSIntegeri=[[UIApplicationsharedApplication]statusBarOrientation];
if(i==UIInterfaceOrientationLandscapeRight){
//在这⾥可以写相应的代码
}
有些⼈可能想要监听屏幕的⾃动旋转:
1.注册UIApplicationDidChangeStatusBarOrientationNotification通知(举例:在⼀个viewcontroller类的viewdidload中注册该通知),⽰例代码如下:
[[NSNotificationCenterdefaultCenter]addObrver:lflector:@lector(statusBarOrientationChange:)name:UIApplicationDidChangeStatusBarOrientationNotificationobj
-(void)statusBarOrientationChange:(NSNotification*)notification{
UIInterfaceOrientationorientation=[[UIApplicationsharedApplication]statusBarOrientation];
if(orientation==UIInterfaceOrientationLandscapeRight)//home键靠右{
//
}
if(orientation==UIInterfaceOrientationLandscapeLeft)//home键靠左{
//
}
if(orientation==UIInterfaceOrientationPortrait){
//
}
if(orientation==UIInterfaceOrientationPortraitUpsideDown){
//
}
}
注意这种⽅式监听的是StatusBar也就是状态栏的⽅向,所以这个是跟你的布局有关的,你的布局转了,才会接到这个通知,⽽不是设备旋转的通知。当我们关注的东西和布局相关
2.注册UIDeviceOrientationDidChangeNotification通知(举例:我们同样在⼀个viewcontroller类的viewdidload中注册该通知),⽰例代码如下:
[[NSNotificationCenterdefaultCenter]addObrver:lflector:@lector(orientChange:)name:UIDeviceOrientationDidChangeNotificationobject:nil];
-(void)orientChange:(NSNotification*)noti
{
NSDictionary*ntfDict=[notiurInfo];
UIDeviceOrientationorient=[UIDevicecurrentDevice].orientation;
/*
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait,//Deviceorientedvertically,homebuttononthebottom
UIDeviceOrientationPortraitUpsideDown,//Deviceorientedvertically,homebuttononthetop
UIDeviceOrientationLandscapeLeft,//Deviceorientedhorizontally,homebuttonontheright
UIDeviceOrientationLandscapeRight,//Deviceorientedhorizontally,homebuttonontheleft
UIDeviceOrientationFaceUp,//Deviceorientedflat,faceup
UIDeviceOrientationFaceDown//Deviceorientedflat,facedown*/
switch(orient)
{
caUIDeviceOrientationPortrait:
break;
caUIDeviceOrientationLandscapeLeft:
break;
caUIDeviceOrientationPortraitUpsideDown:
break;
caUIDeviceOrientationLandscapeRight:
break;
default:
break;
}
}
注意到这种⽅式⾥⾯的⽅向还包括朝上或者朝下,很容易看出这个完全是根据设备⾃⾝的物理⽅向得来的,当我们关注的只是物理朝向时,我们通常需要注册该通知来解决问题(
补充:
利⽤runtime⽅法:
UIInterfaceOrientationifo=[[UIApplicationsharedApplication]statusBarOrientation];
((void(*)(id,SEL,UIInterfaceOrientation,BOOL))objc_msgSend)([UIDevicecurrentDevice],NSSelectorFromString([NSStringstringWithFormat:@"t%@:animated:",tmpStr]),ifo
本文发布于:2023-03-02 05:56:12,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1677707772107049.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:旋转屏幕.doc
本文 PDF 下载地址:旋转屏幕.pdf
留言与评论(共有 0 条评论) |