屏幕旋转
Posted 孤独的菜鸟----
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕旋转相关的知识,希望对你有一定的参考价值。
原理:把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才可以,否则会无效或者屏幕出现比较诡异的效果。
以上是关于屏幕旋转的主要内容,如果未能解决你的问题,请参考以下文章