有时我们的APP并没有适配横屏的需求,但是在个别视频播放界面,我们需要在播放视频的时候横屏,退出全屏的时候不能横屏,但是有时候并没有原生API并没有给出解决方案。
当其他界面不支持横屏时:
这个解决方法比较容易
在 APPDelegate.h 文件中增加属性:是否支持横屏
1
2
|
/*** 是否允许横屏的标记 */
@property
(nonatomic,assign)BOOL allowRotation;
|
在 APPDelegate.m 文件中增加方法,控制全部不支持横屏
1
2
3
4
5
6
|
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if
(self.allowRotation) {
return
UIInterfaceOrientationMaskAllButUpsideDown;
}
return
UIInterfaceOrientationMaskPortrait;
}
|
这样在其他界面想要横屏的时候,我们只要控制 allowRotation 这个属性就可以控制其他界面进行横屏了。
1
2
3
4
|
//需在上面#import "AppDelegate.h"
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotation = YES;
//不让横屏的时候 appDelegate.allowRotation = NO;即可
|
播放界面横屏
所以这里可以使用 UIWindow 的通知,就可以解决
1
2
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:
@selector
(begainFullScreen) name:UIWindowDidBecomeVisibleNotification object:nil];
//进入全屏
[[NSNotificationCenter defaultCenter] addObserver:self selector:
@selector
(endFullScreen) name:UIWindowDidBecomeHiddenNotification object:nil];
//退出全屏
|
在退出全屏时,增加逻辑让其强制编程竖屏,这样当全屏播放的时候,点击 down("完成") 时,就会自动变成竖屏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// 进入全屏
-(
void
)begainFullScreen
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotation = YES;
}
// 退出全屏
-(
void
)endFullScreen
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotation = NO;
//强制归正:
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 =UIInterfaceOrientationPortrait;
[invocation setArgument:&val atIndex:
2
];
[invocation invoke];
}
}
|