根据方向切换故事板
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 之后(仅用于将来更改方向)。以上是关于根据方向切换故事板的主要内容,如果未能解决你的问题,请参考以下文章
在 WebView 加载时显示另一个故事板,然后切换回原始故事板