屏幕旋转

原理:把window窗口旋转

项目需求:

首页不横屏 从首页进入下一个控制器是一个播放界面,用于播放视频,该界面会自动旋转屏幕,并且可以手动旋转屏幕,可以锁定屏幕。

1.首先,我们需要一个全局变量,来标示是否允许旋转,可以在AppDelegate.h文件中 如下声明(info.plist文件里面旋转设置不用管)

@property (nonatomic,assign)BOOL allowRotation;

这里,我们可以定义一个宏,方便我们使用AppDelegate
[Objective-C] 查看源文件 复制代码

#define ApplicationDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate)

然后在AppDelegate.m文件中 实现允许屏幕的方向函数

-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (self.allowRotation) {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

2.然后在控制器中实现允许屏幕旋转的方法 如下

- (BOOL)shouldAutorotate{    
    return ApplicationDelegate.allowRotation;
}

3.然后就可以愉快的玩耍了

当想要旋转屏幕的时候,就去修改ApplicationDelegate.allowRotation的值,默认是NO,是不支持旋转的,所以满足我们的需求
当我们从首页进入播放界面的时候
在页面将要出现的时候 设置为YES
在页面将要消失的时候 设置为NO

- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    ApplicationDelegate.allowRotation==NO;
}

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    ApplicationDelegate.allowRotation==YES;
}

在控制器下还需添加一个通知,用来监听手机方向是否改变,如下:

[[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(changeFrames:) name:UIDeviceOrientationDidChangeNotification
                                              object:nil];

当方向改变的时候,会触发changeFrames方法,然后在该方法里面去判断ApplicationDelegate.allowRotation的值,如果YES就去改变控件的Frame

4.手动旋转屏幕

有时候自动旋转并不能满足我们的需求,还需要用户手动的去点击按钮,触发旋转事件,这里,提供手动旋转函数,直接调用即可。

/**
 *  手动旋转屏幕方法
 *
 *  @param orientation 屏幕方向
 */
- (void)forceOrientation: (UIInterfaceOrientation)orientation {
    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 = orientation;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}

注意:屏幕旋转的前提是ApplicationDelegate.allowRotation的值为YES才可以,否则会无效或者屏幕出现比较诡异的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值