纵向和横向 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(纵向和横向)使用单独的故事板吗?
JTRevealSideBar UI 在 iPhone 和 iPad 的横向模式下无法正确显示