iOS加载新故事板

时间:2014-01-03 20:22:25

标签: ios storyboard

带故事板的简单iOS应用程序 - StoryboardA

当iPad改变方向时 - 我想加载一个新的故事板 - StoryboardB

我把这个逻辑放在哪里。

当横向(及其导航)中的UI与纵向中的UI不同时,这是一种很好的做法。

3 个答案:

答案 0 :(得分:1)

旋转屏幕时的最佳做法是重新布局视图。这就是自动化(弹簧和支柱)背后一直存在的全部原因,以及新的自动布局功能。你应该能够在旋转时根据需要使用它来重新组织你的视图,理想情况下你应该看到一个平滑的旋转。不鼓励在旋转时销毁和重建诸如UI元素之类的资源,这与Android世界中的实际上是首选和默认方法不同。

通常,如果UI在纵向和横向之间在某种程度上实际上是不同的,它仍然有很多共同之处,因此可能会有一个额外的部分出现在横向中,例如,它隐藏在纵向中。我建议不要在轮换时彻底改变你的用户界面,因为这绝对不是常态,会对用户造成伤害。旋转时,您可以轻松隐藏或显示其他部分,而不会有太多麻烦。

如果您必须在轮换时重新创建视图而不是重新排列视图,则至少可以将它们保留在同一个故事板中。没有必要为此目的使用全新的故事板。

至于你在哪里处理这个逻辑,如果你决定采用这种方法,那将取决于在旋转时究竟需要改变什么。如果需要重新创建每个视图控制器,您可能具有在应用程序委托中处理此操作的逻辑。但如果它只是特定的视图控制器,您可能会将逻辑设置为仅在那些特定的控制器中检测和处理这些情况。

正如我所说的那样,我强烈反对这种方法,我认为使用已经存在的机制来轮换你的意见会更好。

答案 1 :(得分:1)

您可以通过以下方式注册UIDeviceOrientationDidChangeNotification

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                             selector:@selector(orientationChanged:)
                             name:UIDeviceOrientationDidChangeNotification
                             object:nil];

并且在收到上述UIDeviceOrientationDidChangeNotification的通知后,您的orientationChanged:方法将被触发,您可以在其中实现您想要实现的任何布局更改,如下所示: -

在您的私人界面isShowingLandscapeView中创建一个BOOL标志,以跟踪当前设备所处的方向并采取相应的行动

BOOL isShowingLandscapeView = NO;

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !isShowingLandscapeView)
    {
        // Changes pertaining to lanscape orientation here
        isShowingLandscapeView = YES;
    }
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
         isShowingLandscapeView)
    {
        // Changes pertaining to portrait orientation here
        isShowingLandscapeView = NO;
    }
}

答案 2 :(得分:0)

您可以按照以下方式加载其他故事板。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil];
UIViewController *initialViewController = [storyboard instantiateInitialViewController];
[[self navigationController] pushViewController:initialViewController animated:YES];