纵向和横向 ipad 的差异 UI

Posted

技术标签:

【中文标题】纵向和横向 ipad 的差异 UI【英文标题】:Difference UI for portrait and landscape ipad 【发布时间】:2015-02-16 02:35:09 【问题描述】:

我想创建一个这样的应用程序:

在 iphone(纵向和横向)和 ipad 纵向上,我有一个表格视图屏幕,点击项目行将导航到另一个细节屏幕,看起来像其他基本应用程序。 但是当我在 ipad 上旋转屏幕转到横向时,屏幕现在有两个剖面视图 这是我所做的:

写一个方法isInLandscapeTablet检测ipad横屏 使用UINavigationController 作为根控制器来控制所有其他视图 在纵向屏幕中,将包含 tableview 的视图控制器推送到根控制器 在平板横屏中,将tableview控制器和detail控制器附加到UISplitViewController,然后将其推送到根控制器中

但问题是我无法将 UISplitViewController 推送到根控制器,因为它需要成为根控制器。 我想知道我该如何处理这个问题 我的方法正确吗?有没有其他办法?

更新:我像这样更改根视图控制器

  // this snippet is in UINavigationController (I use as root viewcontroller) 
        if([self isInTabletLandscape])
             self.splitViewController.viewControllers = [NSArray arrayWithObjects:[[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil], self.propertyLandViewController, nil];
            [[UIApplication sharedApplication].keyWindow setRootViewController:self.splitViewController];
        else
 // it doesn't work
            [[UIApplication sharedApplication].keyWindow setRootViewController:self];
            
        

【问题讨论】:

您应该有三个不同的 viewController - 1 个用于 iPhone 纵向,1 个用于 iPad 纵向,1 个用于 iPad 横向(带有 splitViewController)。根据设备类型和方向将正确的 viewcontroller 推送到 rootViewCcontroller。如果用户旋转 iPad,弹出到 rootViewControler 并再次推送正确的 viewController。您可以在 rootViewContoller 中使用委托设置一个标志,以告知要推送哪个 viewContoller。 @Kilogen9 这就是我所做的。但正如我所说,问题是我无法将 UISplitViewController 推送到根控制器,因为它需要成为根控制器。 @R4j 菜单应该是静态的还是总是横向显示? @NorthBlast 这不是一个真正的菜单。视图 1 始终显示在 ipad 横向的左侧。 【参考方案1】:

在知道设备是 iPad 还是 iPhone 之后。您可以尝试删除 RootViewController。

       appDelegate.window.rootViewController = nil;

然后你用一个新的 SplitViewContloller 设置根视图控制器

        id objClass =[[SplitViewController alloc]initWithNibName:@"SplitViewController" bundle:nil];
        masterVC.delegate = detailVC;
        detailVC.delegate = objClass;
        [objClass setViewControllers:@[masterNavigate,detailNavigate]];

        [appDelegate.window setRootViewController:objClass];

【讨论】:

我更新了我的问题。当我旋转到横向时,这种方式将起作用。但是当我从横向更改为纵向时,它会显示 splitview 控制器的详细视图,而不是我的根视图控制器 你能在github上分享代码吗?这样我就可以帮忙了。【参考方案2】:

我的建议是根本不要使用拆分视图控制器。创建一个自定义视图控制器,它将嵌入您的表视图控制器和第二个控制器。此外,您可以在您创建的自定义控制器中实现界面旋转逻辑。

【讨论】:

你有自定义视图控制器像拆分视图控制器一样的示例吗? 我有创建不同自定义控制器的经验。如果您是 ios 开发新手,我建议您在 storyboard 中使用 Container View。该视图可以在对象检查器中找到。它为自定义子控制器提供 embed segue。使用两个容器,用于表格和细节。 看起来很有希望。我会试一试。非常感谢您【参考方案3】:

如果您在 iOS 8 上进行开发,您应该使用Size Classes,这样您就可以完全根据 iPhone/iPad 纵向和 iPad 横向更改布局。不幸的是,在 iOS 7 上,尺寸等级只能区分 iPhone 和 iPad。

在这两种情况下,右侧部分 (2),都可以使用 containerView 轻松处理。

【讨论】:

好吧,我知道尺码等级,但我认为这对我的情况没有帮助。因为它不仅是不同的 UI,而且是不同的逻辑。我需要的是组织视图层次结构以处理视图逻辑的正确方法【参考方案4】:

https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/SplitViewControllers.html

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

   MyFirstViewController* firstVC = [[MyFirstViewController alloc] init];
   MySecondViewController* secondVC = [[MySecondViewController alloc] init];

if ( ([[UIDevice currentDevice] orientation] ==  UIDeviceOrientationPortrait)  )

   UISplitViewController* splitVC = [[UISplitViewController alloc] init];
   splitVC.viewControllers = [NSArray arrayWithObjects:firstVC, secondVC, nil];

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.rootViewController = splitVC;
   [window makeKeyAndVisible];
 
    else

// Display tableview


 return YES;
 

我想这可能会对你有所帮助..

【讨论】:

它看起来像下面詹姆斯的回答。当从横向旋转到纵向时,它显示 view2 而不是 tableview(视图 1)。这是我的 sn-p:pastebin.com/DAs38PsU

以上是关于纵向和横向 ipad 的差异 UI的主要内容,如果未能解决你的问题,请参考以下文章

我可以为 iPhone 和 iPad(纵向和横向)使用单独的故事板吗?

iPad 应用程序,HTML5,横向和纵向旋转

JTRevealSideBar UI 在 iPhone 和 iPad 的横向模式下无法正确显示

支持iPhone 6和iPhone 6+,具有不同的启动/启动屏幕图像,适用于iPad纵向和横向方向

ipad:横向和纵向方向的问题

奇怪的 iPad 纵向和横向视图问题