iPhone仅景观实用程序 - 模板应用程序

时间:2009-02-08 13:49:25

标签: iphone landscape

我正在尝试使用Utility应用程序模板创建一个始终处于横向模式的iPhone应用程序。这是我做的:

  • 使用Utility Application模板
  • 创建一个新的iPhone应用程序项目
  • 在Interface Builder中,将所有视图旋转90度。
  • 在Interface Builder中,将标签添加到MainView的中间。在视图中一直拉伸,将对齐设置为居中,并设置自动调整弹簧,使其可以水平拉伸。
  • 在Info.plist中,添加值为“UIInterfaceOrientationLandscapeRight”的键“UIInterfaceOrientation”
  • 在控制器类中,将shouldAutorotateToInterfaceOrientation方法更改为“return(interfaceOrientation == UIInterfaceOrientationLandscapeRight)||(interfaceOrientation == UIInterfaceOrientationLandscapeLeft);”
  • 运行该应用。

当我启动我的应用程序时,它以横向方向显示,但主视图仅覆盖显示屏的上半部分,并且水平拉伸。我在模拟器和实际设备上都得到了相同的结果。我已经在SDK的2.2和2.2.1版本中看到了它。

我已经能够通过在上面添加以下步骤来解决这个问题:

  • 添加“self.view.autoresizesSubviews = NO;” “[super viewDidLoad];”之后的RootViewController的viewDidLoad方法。

如果我这样做,那么它按预期工作。但这感觉就像一个黑客。为什么这有必要?

我不认为这是转型问题。所有元素都以正确的方向绘制并具有适当的缩放比例。问题似乎是主视图的边界矩形变得很时髦。看起来主视图的高度减少了一半以上,宽度增加了约50%。

如果我使用基于视图的应用程序模板而不是实用程序执行完全相同的步骤,那么一切都按预期工作。所以我很确定问题是针对Utility应用程序如何管理其视图的。

有人知道这里发生了什么吗?

3 个答案:

答案 0 :(得分:3)

我打算说设置此键不会旋转你的界面;您仍然需要以横向模式布置内容并使用CFAffineTransform进行适当的旋转 - 请参阅“iPhone OS编程指南”中的“在横向模式下启动”。为了找到你的参考,我发现这个评论:“要在v2.1之前的iPhone OS版本中以横向模式启动基于视图控制器的应用程序,你需要对应用程序的转换应用90度旋转。除了上述所有步骤之外,根视图。在iPhone OS 2.1之前,视图控制器没有根据UIInterfaceOrientation键的值自动旋转视图。但是,在iPhone OS 2.1及更高版本中,此步骤不是必需的。“ p>

因此,如果您在2.1之前运行,则需要将此代码添加到视图控制器中的viewDidLoad方法。 (否则,你可以发布一些代码吗?)

-(void)viewDidLoad 
// After loading the view, transform the view so that the co-ordinates are right for landscape
// As described in iPhone Application Programming Guide
// Weird, I'm sure this used to be needed, but it doesn't now. The one in CardScrollViewController is needed though.
{
    [super viewDidLoad];

    CGAffineTransform transform = self.view.transform;
    CGPoint center = CGPointMake(kScreenHeight / 2.0, kScreenWidth / 2.0);

    // Set the center point of the view to the center point of the window's content area.
    self.view.center = center;

    // Rotate the view 90 degrees around its new center point.
    transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
    self.view.transform = transform;    
}

答案 1 :(得分:2)

Jane将UIInterfaceOrientation的设置描述为UIInterfaceOrientationLandscapeRight(或UIInterfaceOrientationLandscapeLeft),以及文档中推荐的旋转设置,但我在根视图控制器中使用了稍微不同的代码块(到同一端):

- (void)loadView 
{
    UIView *primaryView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    primaryView.backgroundColor = [UIColor clearColor];

    // Start in landscape orientation, and stay that way
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationLandscapeRight) 
    {
        CGAffineTransform transform = primaryView.transform;

        // Use the status bar frame to determine the center point of the window's content area.
        CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
        CGRect bounds = CGRectMake(0, 0, statusBarFrame.size.height, statusBarFrame.origin.x);
        CGPoint center = CGPointMake(60.0, bounds.size.height / 2.0);

        // Set the center point of the view to the center point of the window's content area.
        primaryView.center = center;

        // Rotate the view 90 degrees around its new center point.
        transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
        primaryView.transform = transform;
    }   

    self.view = primaryView;
    [primaryView release];  
}

除此之外,我在根视图控制器中实现了以下委托方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    return ( (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}

最后,我遇到了奇怪的故障,模拟器没有正确自动旋转,所以我需要在UIApplicationDelegate中实现以下委托方法:

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
{
    // This prevents the view from autorotating to portrait in the simulator
    if ((newStatusBarOrientation == UIInterfaceOrientationPortrait) || (newStatusBarOrientation == UIInterfaceOrientationPortraitUpsideDown))
        [application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
}

毕竟,我的应用程序能够以横向(右)开始,并在2.0固件和模拟器下保持该方向。

答案 2 :(得分:0)

尝试在视图中将视图的orientation属性设置为Landscape。此属性可以在模拟矩阵下UIView的信息视图的第4个选项卡[属性检查器]中找到。