以横向模式启动应用程序

Posted

技术标签:

【中文标题】以横向模式启动应用程序【英文标题】:Launching app in Landscape Mode 【发布时间】:2013-08-05 22:50:49 【问题描述】:

我有一个我只想在横向模式下使用的应用程序。

有史以来第一次,我在 IB 之前尝试以编程方式设置我的所有视图,所以我正在创建一个视图并在 loadView 方法中添加一堆子视图:

self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

// Create a GMSCameraPosition that tells the map to display the
// coordinate -33.86,151.20 at zoom level 6.
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86
                                                        longitude:151.20
                                                             zoom:6];

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
self.mapView.myLocationEnabled = YES;
self.mapView.delegate = self;
self.mapView.mapType = kGMSTypeHybrid;
self.mapView.frame = self.view.frame;
[self.view addSubview:self.mapView];

// add the toolbar
UIToolbar* toolbar = [[UIToolbar alloc] init];
toolbar.frame = CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44);
toolbar.barStyle = UIBarStyleDefault;
NSMutableArray* items = [NSMutableArray array];
[items addObject:[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"location-arrow.png"]
                                                  style:UIBarButtonItemStyleBordered
                                                 target:self
                                                 action:@selector(locateMe:)]];
[items addObject:[[UIBarButtonItem alloc] initWithTitle:@"Tools"
                                                  style:UIBarButtonItemStyleBordered
                                                 target:self
                                                 action:@selector(toolsButtonTapped:)]];
[toolbar setItems:items];
[self.view addSubview:toolbar];

在我的项目设置中,我禁用了两个纵向。我的根视图控制器中也有这个:

// Enforce Landscape Orientation
-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscape;


-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
 
    return UIInterfaceOrientationLandscapeRight;

我的问题是模拟器以横向模式启动,但所有视图的大小都是纵向的 - 所以我的视图的底部部分位于屏幕下方,屏幕右侧是一个很大的空白区域。

我尝试通过在第一行切换应用程序框架的宽度和高度来解决此问题,但随后在屏幕左边缘为状态栏留下了一些空的垂直空间。

那么,做我想做的事情的正确方法是什么?

【问题讨论】:

只是想知道,在设备上测试时会发生什么? 你可以试试self.view.transform = CGAffineTransformMakeRotation( M_PI / 2 ); @Squatch:这是一个新客户的应用程序,所以它是用他们的帐户创建的,在会员中心恢复之前我不能作为会员加入,所以我可以'不要在设备上运行它。 @Virussmca:这是 90 度转弯吗?我不明白这有什么帮助。我会试试看。 【参考方案1】:

而不是使用[[UIScreen mainScreen] applicationFrame]

尝试使用[[[[[self view] window] rootViewController] view] bounds]

边界将正确表示横向方向的宽度和高度,因为边界将考虑已应用的变换(旋转),而框架则不会。

要明白我的意思,设置一个断点,然后在调试器中打印出顶层视图的描述lldb> po [[[[self view] window] rootViewController] view]

您会看到视图有一个旋转变换,并且它的框架不代表横向屏幕的尺寸,而是代表纵向的尺寸!


计算正确的 applicationFrame 的漫长方法是

BOOL ios7 = NO;
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
    iOS7 = YES;

CGRect theFrame;
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect screenBounds = [[UIScreen mainScreen] bounds];

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) 

    theFrame.origin = CGPointZero;
    theFrame.size.width = screenBounds.size.height;
    theFrame.size.height = screenBounds.size.width;

    if (iOS7 == NO) 
        // statusBarFrame will be CGRectZero if not visible, so this is safe
        theFrame.size.height -= statusBarFrame.size.width;  // because we're in landscape orientation
    

else 

    theFrame = screenBounds;

    if (iOS7 == NO) 
        // statusBarFrame will be CGRectZero if not visible, so this is safe
        theFrame.size.height -= statusBarFrame.size.height;  // because we're in portrait orientation
    

【讨论】:

[[[[self view] window] rootViewController] view]self.view。我不应该只是得到窗口的界限吗?无论哪种方式,我都会试一试。 在上面添加了更多细节。希望这会有所帮助。【参考方案2】:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation



    if (UIInterfaceOrientationIsLandscape( interfaceOrientation)) 
    
        return  YES;
    
    return NO;

把这段代码Appdelegate .M.....

【讨论】:

【参考方案3】:

把它放在当前的视图控制器中 // iOS 5

 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    


        if (UIInterfaceOrientationIsLandscape( interfaceOrientation)) 
            return  YES;
        
        return NO;
    

//ios6

-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscape;

【讨论】:

这在 iOS 6 中已被弃用。Xcode 说我应该使用我正在使用的 2 种方法。

以上是关于以横向模式启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在横向模式下飞溅(启动图像)?

在拆分视图中,当应用程序以横向模式启动时如何将视图调整到屏幕

在 iPad 上以横向启动后,iphone 应用程序没有响应

Google play 游戏服务 - 从应用程序以横向模式启动 google+ 登录流程

横向模式下的 iPhone MPMoviePlayer

锁定视图以最初在横向(仅横向)目标-C 中启动