iOS屏幕旋转

本文探讨了在iOS中处理屏幕旋转的各种方法,包括使用`CGAffineTransformMakeRotation`进行手动旋转,通过`supportedInterfaceOrientations`和`UIDeviceOrientationDidChangeNotification`监听屏幕变化,强制旋转屏幕的技巧,以及在不同场景下使用不同ViewController来适应屏幕方向。同时,文中提到了Apple对强制屏幕旋转的限制以及如何在审核中规避问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 唉,用了这种方式   出现了各种衍生问题。。。

self.view.transform = CGAffineTransformMakeRotation(-M_PI/2);

如果想要电池条跟随旋转可以设置[UIApplication sharedApplication] setStatusBarOrientation。不过该方法生效需要:- (UIInterfaceOrientationMask)supportedInterfaceOrientations返回值是0.


这种方式也可以结合UIDeviceOrientationDidChangeNotification来使用。即使(UIInterfaceOrientationMask)supportedInterfaceOrientations返回值设定为0  或者用户开启了 屏幕旋转锁定;仍然可以监听到UIDeviceOrientationDidChangeNotification。并通过[UIDevicecurrentDevice].orientation来判断当前屏幕朝向。

2.系统自动监测屏幕旋转

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAll;

}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{//(UIInterfaceOrientationMask)supportedInterfaceOrientations返回值设定为0  或者用户开启了 屏幕旋转锁定都将不再响应该方法

    [superwillAnimateRotationToInterfaceOrientation:toInterfaceOrientationduration:duration];

    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft||toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {

//做一些需要的操作

    }

}

3.

通过setOrientation:的办法强制性的旋转到一个特定的方向。

    注意:Apple在3.0以后都不支持这个办法了,这个办法已经成为了私有的了,但是要跳过AppStroe的审核,需要一点巧妙的办法。

   不要直接调用[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]这样的办法来强制性的横屏,这样导致你的程序是很难通过AppStore审核的。但是你可以选择使用performSelector的办法来调用它。具体就几行代码如下:

//强制横屏
    if([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)]) {
       [[UIDevice currentDevice]performSelector:@selector(setOrientation:)//这种方式需要在MRC状态下才能正确执行
                                      withObject:(id)UIInterfaceOrientationLandscapeRight];
    }

ARC情况下用:

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

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

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

                [invocation setSelector:selector];

                [invocation setTarget:[UIDevicecurrentDevice]];

                int val =UIInterfaceOrientationPortrait;

                [invocation setArgument:&valatIndex:2];

                [invocation invoke];

            }

4.是不是可以用两个viewController。竖直方向的一个viewController(只支持纵向),横向的一个(只支持横向左或右)。

强制横屏参考 从ViewController初始化一直谈到强制横屏        http://blog.sina.com.cn/s/blog_76264a170101e5lb.html


PS:

UIDeviceOrientation      是机器硬件的当前旋转方向   这个你只能取值 不能设置

UIInterfaceOrientation   是你程序界面的当前旋转方向   这个可以设置  额。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值