ui问题JC专题

iOS 强制转屏

2015-12-29  本文已影响1159人  LaiYoung_

由于最近在做一个实训项目,项目中有几个界面需要强制转屏于是乎就在网上找了一下关于iOS强制转屏的一些博客。

发现很多博客都只是把代码粘贴上去没有做详细的讲解。对于初学者理解起来很困难(其实我也是菜鸟😂)。

切入正题!

在iOS中强制转屏的方式有两种:

1.通过人为的改变view的transform属性来达到目的,达到转屏要改变view的transform属性还要改变电池条的显示方向(这其中就需要获取当前电池条的方向,当前屏幕的大小...),操作难度系数对于初学者来说是极大的。代码量不低于15行。less code less bug !

2.通过setOrientation:的办法强制性的旋转到一个特定的方向 只有9行代码,这里面要注意的是setOrientation: 在3.0以后成为私有API,也就意味着使用这个私有API上架在AppStore审核很难通过。在我搜索到的几篇博客中👉http://www.cocoachina.com/bbs/read.php?tid=39663  有提到如何解决

/**

*关于iOS强制转横屏的博客

*http://www.cocoachina.com/bbs/read.php?tid=39663

*http://stackoverflow.com/questions/7968451/different-ways-of-getting-current-interface-orientation#

*http://stackoverflow.com/questions/634745/how-to-programmatically-determine-iphone-interface-orientation/3897243#3897243

*http://zhenby.com/blog/2013/08/20/talk-ios-orientation/

*/

//setOrientation: 3.0~成为私有API据说运用此方法很难通过AppStore的审核,具体解决的办法在上面几篇博客中有提到

以下是具体代码及一些代码的解释

if([[UIDevicecurrentDevice]respondsToSelector:@selector(setOrientation:)]) {

//http://mobile.51cto.com/hot-431728.htmSEL

//http://blog.csdn.net/huifeidexin_1/article/details/8608074NSSelectorFromString

//http://blog.jobbole.com/45963/Objective-C的动态提示和技巧

//NSSelectorFromString动态加载实例方法

SELselector =NSSelectorFromString(@"setOrientation:");//==SEL selector = @selector(setOrientation:);

/**

*iOS中可以直接调用某个对象的消息方式有两种

*1.performSelector:withObject;

*2.NSInvocation

*/

//https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/#//apple_ref/occ/instm/NSInvocation/setArgument:atIndex:NSInvocation官方文档

/**

*NSInvocation;用来包装方法和对应的对象,它可以存储方法的名称,对应的对象,对应的参数

*NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。

*以上内容在官方文档中都有提到

*/

//调用签名方法

//创建签名对象的时候不是使用NSMethodSignature这个类创建,而是方法属于谁就用谁来创建

NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];//==NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:@selector(setOrientation:)]];

[invocationsetSelector:selector];//==[invocation setSelector:@selector(setOrientation:)];

[invocationsetTarget:[UIDevicecurrentDevice]];

intval =UIInterfaceOrientationPortrait;//竖屏

/**

*第一个参数:需要给指定方法传递的值

*第一个参数需要接收一个指针,也就是传递值的时候需要传递地址

*第二个参数:需要给指定方法的第几个参数传值

*注意:设置参数的索引时不能从0开始,因为0已经被self(target)占用,1已经被_cmd(selector)占用在NSInvocation的官方文档中已经说明

*(_cmd在Objective-C的方法中表示当前方法的selector,正如同self表示当前方法调用的对象实例。)

*/

[invocationsetArgument:&valatIndex:2];

/**

*调用NSInvocation对象的invoke方法

*只要调用invocation的invoke方法,就代表需要执行NSInvocation对象中制定对象的指定方法,并且传递指定的参数

*/

[invocationinvoke];

/**

*关于NSInvocation的博客

*http://blog.csdn.net/onlyou930/article/details/7449102 

*http://www.jianshu.com/p/da96980648b6

*http://my.oschina.net/u/2340880/blog/398552?fromerr=sAJ1ndvB

*/

}

转屏代码应该在视图将显示时候执行

代码

if([[UIDevicecurrentDevice]respondsToSelector:@selector(setOrientation:)]) {

SELselector =NSSelectorFromString(@"setOrientation:");

NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];

[invocationsetSelector:selector];

[invocationsetTarget:[UIDevicecurrentDevice]];

intval =UIInterfaceOrientationLandscapeRight;//横屏

[invocationsetArgument:&valatIndex:2];

[invocationinvoke];

}

现有A,B两个控制器 A是竖屏,B控制器是横屏,发现从B控制器pop回A控制器,A控制器也变成了横屏,这时候需要在A控制器里面设置转屏为竖屏即解决

源码👉 github.com/CYBoys/TurnScreenTest

以上内容如有写错还请大神指点!

上一篇下一篇

猜你喜欢

热点阅读