如何在 iOS 中支持横向和纵向视图?

Posted

技术标签:

【中文标题】如何在 iOS 中支持横向和纵向视图?【英文标题】:How to support landscape and portrait view in iOS? 【发布时间】:2012-10-12 15:12:38 【问题描述】:

在我的应用程序中,我支持单个 ViewController 的横向和纵向。我可以使用 Autoresize 来支持横向和纵向。但我需要制作不同于肖像的自定义风景。我对 ios 很陌生。在 google 和 SO 中搜索了很多,但找不到解决方案。

我正在使用 Xcode 4.5 和 storyboard 来制作视图。

如何支持自定义横向和纵向视图?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在你的 .m 文件中试试这个:

- (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    
        // Portrait

        [object setFrame:CGRectMake(...)];

        // Do the same for the rest of your objects
    

    else
    
        // Landscape

        [object setFrame:CGRectMake(...)];

        // Do the same for the rest of your objects
    

在函数中,您已经定义了每个对象在视图中的位置,包括纵向和横向。

然后您在viewWillAppear 中调用该函数以使其开始工作;视图决定在开始时使用哪个方向:

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    [self updateLayoutForNewOrientation:self.interfaceOrientation];

另外,当你旋转时:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
    
     [self updateLayoutForNewOrientation:self.interfaceOrientation];

如果我需要在方向方面更个性化的外观,我会采用这种方法。希望这对你有用。

编辑:

如果您在一个 UIViewController 中使用两个 UIView,一个用于纵向,另一个用于横向,您可以将代码的第一部分更改为如下所示:

- (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    
        // Portrait

        portraitView.hidden = NO;
        landscapeView.hidden = YES;
    

    else
    
        // Landscape

        portraitView.hidden = YES;
        landscapeView.hidden = NO;
    

这个经过编辑的样本与原始样本各有利弊。在原始版本中,您必须为每个对象编写代码,在此编辑后的示例中,您只需要此代码,但是,您实际上需要分配对象两次,一次用于纵向视图,另一次用于横向视图。

【讨论】:

感谢您的回答。我对 CGRectMake 中的内容有点困惑。因为目前我使用情节提要制作了两个视图。一个用于横向,另一个用于纵向。如何将这两个视图链接到您的代码中 CGRectMake 用于定义接口对象的位置,以及这些对象的大小 -- CGRectMake(x-position, y-position, width, height) -- 我将编辑我的答案以反映如果你是你会做什么使用两个 UIView。 如果我的附加代码是您要查找的内容,您可能还希望在 updateLayout 函数中包含[landscapeView setFrame:CGRectMake(0, 0, width, height)] 等,甚至可能是 viewDidLoad,以防某些东西在接口中意外重定位生成器。 感谢您的详细解答。我今天不能尝试,因为我现在没有 Mac。我会在星期一试试这个,让你知道 +1 为你的努力和支持干杯 你能解释一下吗?我不知道我是怎么做到的,但我需要使用这个方向,请帮助我..【参考方案2】:

您仍然可以使用 Sean 的方法,但由于您有 2 个不同的视图,您可能有 2 个不同的 Xib 文件,因此您可以执行 [[NSBundle mainBundle] loadNibNamed:"nibname for orientation" owner:self options:nil]; [self viewDidLoad]; 之类的操作,而不是 CGRect 部分。因为我还没有使用它,所以我不知道这将如何与故事板一起使用,但我在一个需要不同方向布局的应用程序中执行此操作,因此我创建了 2 个 Xib 文件并将它们都连接到 ViewController 所以旋转时会加载相应的 Xib 文件。

【讨论】:

以上是关于如何在 iOS 中支持横向和纵向视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何在情节提要中在横向和纵向视图之间切换?

如何仅支持一个 UIView 的横向/纵向方向

iOS Auto Layout - 如何让两个堆叠的纵向视图在横向中并排移动?

如何同时支持纵向和横向模式 - XIB 的可重用视图

如何强制 iOS 应用以纵向模式启动

如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)