根据方向切换故事板

Posted

技术标签:

【中文标题】根据方向切换故事板【英文标题】:Switch storyboard according to orientation 【发布时间】:2016-03-03 14:57:46 【问题描述】:

目前我已经设置了针对横向模式优化的情节提要。起初我想我只会允许横向。然而,在此过程中,我决定允许这两种选择会更好。我现在所做的是创建一个新的故事板,其中包含纵向布局。

我这样做是因为视图的设置完全不同。有没有办法在运行时根据方向在情节提要之间切换,或者我正在做的事情真的很糟糕,是否建议转向不同的方向。

我认为使用 xib 文件会导致重复代码,我可能完全错了。我很想知道是否可以,如果可以,如何实现。如果这完全是一个好习惯。我现在设置它的方式,故事板都使用相同的视图控制器,所以它们都使用相同的方法/出口

根据 Haroldo Gondim 的 awnser 进行编辑

我把它放在 AppDelegate 的 didFinishLaunchingWithOptions 中。

NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)

那么我在应用委托类中也有这个功能

func rotated()
    if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation))
    
        storyboard = UIStoryboard.init(name: "Main", bundle: nil)
    

    if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation))
    
        storyboard = UIStoryboard.init(name: "portrait", bundle: nil)
    
    //self.window?.rootViewController = storyboard?.instantiateInitialViewController()
    storyboard?.instantiateViewControllerWithIdentifier("ViewController")
    //self.window?.makeKeyAndVisible()

我也试过instantiateInitialViewController

但无论我尝试什么都不会改变故事板。它确实以应有的方式进入 if 语句

【问题讨论】:

【参考方案1】:

Xcode 故事板有一个很棒的特性,叫做 size classes。一开始有点难以理解,但希望本教程对您有所帮助

http://www.raywenderlich.com/113768/adaptive-layout-tutorial-in-ios-9-getting-started

【讨论】:

【参考方案2】:

内置的尺寸类允许您在同一个故事板上构建完全不同的 UI。运行时将为当前设备/方向(大小类)选择适当的场景/控件,并将自动布局(利用 AutoLayout)。查看本地 Xcode 帮助中的 size classes 功能,因为它非常易于使用。本质上,以各种尺寸布局整个场景,然后在布局新场景之前更改尺寸等级(以参考新方向)(如果您愿意,可以使用所有新 UI)...

链接新的用户界面,你就完成了。

问:你不会得到很多代码副本吗?

响应

如果您使用尺寸等级重新排列 UI 元素,那么您可以 使用多个 VC。如果您正在创建新的 UI 元素,那么您需要像任何新的一样添加 IBOutlets 和查看操作代码 控件通常会添加到现有的 ViewController。使用 自动布局和大小类可以重新排列现有视图,而无需 任何代码调整。布局更改隐藏在 故事板文件为 xml。如果您右键单击情节提要文件 您可以作为源代码打开并查看。要还原右键单击并 作为界面生成器打开。

【讨论】:

你不会得到很多代码副本吗?有了这个,我的意思是你不会多次使用相同的代码,因为每个大小类都有它自己的视图/视图控制器。这只是我想知道的事情。我知道尺寸等级选项。我以前从未真正使用过它,我远离它,因为我害怕我必须重做所有事情(这基本上是正确的,因为我已经使用 any 设置创建了视图) size 类是完全相反的 - 认为它是界面构建器的超类,any-any size 类是一个抽象布局,不对应于任何实际的 iphone 或 ipad 屏幕 - 但是你由于您构建的约束都是相对的,因此在这个尺寸类中构建可以显示在任何屏幕上。始终建议首先使用此尺寸等级 - 当您想要针对不同方向进行特定布局时,您将使用适用于所有横向 iPhone 的紧凑高度尺寸等级 - 然后您只需更改您想要更改的元素跨度> @Blakusl 到目前为止,我确实最终尝试使用尺寸等级并没有太大问题。但是我希望 iPad 横向和纵​​向的视图也不同。但他们似乎都在使用常规高度和宽度尺寸类。我该怎么办?【参考方案3】:

Autolayout 可以让你重新排列不同方向的视图。

对于不同的功能和元素,你应该使用Size Class,按照@Blakusl链接的教程,非常好。

【讨论】:

【参考方案4】:

检查设备方向并根据方向实例化您的故事板。

UIStoryboard *storyboard;

if(([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) || ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft))

    storyboard = [UIStoryboard storyboardWithName:@"StoryboardLandscape" bundle: nil];    
 else 
    storyboard = [UIStoryboard storyboardWithName:@"StoryboardPortrait" bundle: nil];


[storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

编辑

在每个视图控制器中你必须添加一个标识符

【讨论】:

你会在哪里做这个?在应用程序委托内?另外我正在使用 swift,这并不重要,我重写它没有问题,只是想知道我会把它放在哪里 您应该在: 1) App Delegate 启动您的应用程序时使用。 2)当你打电话改变屏幕。 3)当你改变方向时(我不确定,但我认为在 viewWillAppear 中) 我以不同的方式完成了它,它只使用了应用程序委托类。但是只有一个问题,在这种情况下viewControllerIdentifier 是什么?只是用于初始视图控制器的视图控制器的名称? 在每个视图控制器中你必须添加一个标识符。我在问题中添加了一张图片。 我认为在第一次执行中,您必须在旋转函数中执行代码。并在您注册 NSNotificationCenter 之后(仅用于将来更改方向)。

以上是关于根据方向切换故事板的主要内容,如果未能解决你的问题,请参考以下文章

2个不同的纵向和横向故事板

在 WebView 加载时显示另一个故事板,然后切换回原始故事板

2 个用于纵向和横向的故事板

IOS 启动屏幕故事板以不同的方向显示

Xcode 4.5 和 iOS 6.x 中的故事板方向支持?

故事板中视图控制器之间的共享实例