我有一个9-10屏幕的应用程序。我将UINavigationController
嵌入到我的视图控制器中。我有几个视图控制器,我想只设置纵向:它意味着旋转设备不应该将这些视图控制器旋转到横向模式。我尝试了以下解决方案:
第一
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
但屏幕仍然会旋转到横向。
第二
我创建了一个自定义视图控制器类PortraitViewController
,并在PortraitViewController.m
@interface PortraitViewController ()
@end
@implementation PortraitViewController
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
//Here check class name and then return type of orientation
return UIInterfaceOrientationMaskPortrait;
}
@end
之后我将PortraitViewController.h
实现为基类
#import <UIKit/UIKit.h>
#import "PortraitViewController.h"
@interface Login : PortraitViewController
@end
根本不起作用,仍允许视图控制器以横向模式旋转。
我使用的是iOS 8&amp;不希望viewcontroller以横向模式旋转吗?
修改 是否可以仅为某些视图控制器设置横向方向,并强制其他视图控制器方向粘贴到纵向?
答案 0 :(得分:7)
尝试继承您正在使用的UINavigationController
,因为默认UINavigationController
不会将shouldAutorotate
方法转发给您的viewcontroller。
在UINavigationController
子类
- (BOOL)shouldAutorotate
{
return [self.visibleViewController shouldAutorotate];
}
现在UINavigationController
会将方法调用转发到其当前可见的UIViewController
,因此您需要单独实施shouldAutorotate
以获得所需的效果。
答案 1 :(得分:5)
您的PortraitViewController没问题,我不知道您的Storyboard配置。在您的情况下,重要的是您应该将目标视图控制器嵌入到另一个新的导航控制器中,然后将它的类设置为您的PortraitViewController并以模态方式呈现该导航,就像我在下面的图像中所做的那样并且它按预期工作。
If you want to show animation that will make presentation animation like push animation
下面是我的UINavigationController的PortrateNavigation子类
PortrateNavigation.h
#import <UIKit/UIKit.h>
@interface PortrateNavigation : UINavigationController
@end
PortrateNavigation.m
#import "PortrateNavigation.h"
@implementation PortrateNavigation
- (void)viewDidLoad {
[super viewDidLoad];
}
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
答案 2 :(得分:5)
尝试将此方法与shouldAutorotate
和supportedInterfaceOrientations
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
//Setting the orientation of the view. I've set it to portrait here.
return UIInterfaceOrientationPortrait;
}
此外,您可以使用此[UIViewController attemptRotationToDeviceOrientation]
以便它旋转到所需的新方向
答案 3 :(得分:3)
在UINavigationController
上创建一个类别并覆盖supportedInterfaceOrientations
#import "UINavigationController+Orientation.h"
@implementation UINavigationController (Orientation)
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate
{
return YES;
}
@end
当您嵌入UINavigationController
时,容器不会询问他们的孩子是否要旋转
答案 4 :(得分:1)
你必须手动完成。所有视图控制器,在您不想旋转视图的视图中,都实现以下方法。
- (BOOL)shouldAutorotate
{
return NO;
}
答案 5 :(得分:1)
在视图控制器中查看此内容
- (BOOL)shouldAutorotate{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationPortrait |
UIInterfaceOrientationPortraitUpsideDown;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}
答案 6 :(得分:1)
1)在AppDelegate中创建一个bool变量。
2)然后复制&amp;粘贴到AppDelegate.m中的代码下面(根据您的要求修改)
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation)
if (self.isLandscape == YES) //bool created in first step
{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
return UIInterfaceOrientationMaskPortrait;
}
3)现在复制&amp;粘贴到要强制定位的视图控制器的viewWillAppear方法中的代码下面。
[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step
NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"];
4)现在在推送这个视图控制器之前,你需要先设置bool。所以,让我们说你想推ABC视图控制器
[AppDelegate sharedAppDelegate].isLandscape = YES;
[self.navigationController pushViewController:<ABC view controller instance> animated:NO];
希望这会有所帮助!!
答案 7 :(得分:0)
class ViewController: UIViewController {
override func shouldAutorotate() -> Bool {
return false
}
}
以下是该主题的链接: http://koreyhinton.com/blog/lock-screen-rotation-in-ios8.html
答案 8 :(得分:0)
如果要暂时禁用自动旋转,请避免操作方向遮罩来执行此操作。而是覆盖初始视图控制器上的shouldAutorotate方法。在执行任何自动旋转之前调用此方法。如果它返回NO,则旋转被抑制。
因此,您需要子类化&#39; UINavigationController&#39;,实现shouldAutorotate并在故事板中使用导航控制器类。
- (BOOL)shouldAutorotate
{
id currentViewController = self.topViewController;
if ([currentViewController isKindOfClass:[DetailViewController class]])
return NO;
return YES;
}
可以在
上找到替代方法http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/