- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
现有的 iOS 7+ 应用程序支持 iPhone 和 iPad。目前我正在为 iPhone 和 iPad 布局使用两个不同的 Storyboard,效果很好。现在,我正在尝试使用自适应大小类将其转换为单 Storyboard布局。
我的问题是,我的 iPhone 和 iPad 布局完全不同。他们不仅为控件使用不同的大小和位置,而且还使用了一些完全不同的 View Controller 。
两个 Storyboard都使用 MMDrawerController
作为初始VC。但是从那里开始,控制流程就不同了。 iPad Storyboard 使用 UISplitViewController
作为所有其他 ViewController 的基础,而 iPhone 使用 UITabBarViewController
。
这只是一个区别,但还有其他区别。这些差异应该如何在一个 Storyboard 中处理?为了实现这一点,我将不得不根据当前的 Size Class 指定不同的 segues。但据我所知这是不可能的。
一些新的 iOS 8 自适应 Segues 可以根据大小类表现不同,但据我所知,不可能为不同的大小类指定不同的 segues。此外,不可能根据 Size Class 定义不同的初始 ViewController。
那么问题来了:是否可以在一个 Storyboard 中指定两种不同的布局(包括不同的 Segues、ViewControllers 等)?
切换到单个 Storyboard的原因是为了支持 iOS 9 中新的分屏和侧拉功能。在启动时根据屏幕尺寸/尺寸类别加载不同的 Storyboard很容易。但是当大小类动态更改时,在运行时切换到另一个 Storyboard 是不可能的。是吗?
最佳答案
我刚刚经历过类似的痛苦,发现处理较大差异的唯一真正方法是像往常一样在 Storyboard 中创建单独的 Controller 和转场,但在代码中执行它们而不是依赖 Storyboard 中创建的转场激活.
在我的例子中,我在 iPhone 和 iPad 上都使用了侧边菜单,但在 iPad 上主显示器使用的是 Split View Controller ,而在 iPhone 上使用 UINavigationController。更复杂的是,在 iOS8 上,UISplitViewController 在 iPhone 上受支持,但在 iOS7 上不支持,在 iOS7 上它被视为 UINavigationController。
据我所知,您不能使用大小类来自动触发正确类型的转场。但是,只要您有做出选择的机制,就可以在代码中做到这一点。因此,您仍然可以为每个尺寸类别创建 segue,或者为给定的设备类型改进您的显示模式,并从代码中调用正确的模式。
您最大的问题是 iOS9 分屏,它似乎会在您滑动时动态地将尺寸类别从 iPad regularW/regularH 更改为 iPad compactW/regularH 并返回。你会接受像 Split View这样的东西,它会简单地切换成看起来像导航 Controller 堆栈。我看不出有什么办法可以快速切换到标签栏,除非你跳回根目录,让应用程序委托(delegate)切换根屏幕并将你导航回同一个地方。很大程度上取决于您希望在这种情况下看到什么。
最后,我在 Storyboard中的一般经验法则是:
0) 在 App delegate 中,确定设备类型并将根屏幕设置为正确的 Storyboard Controller 入口点:例如iPad 上的 Split View,iPhone 上的选项卡 View 。将一些方法/属性添加到应用程序委托(delegate)以供任何 Controller 访问以找出当前运行模式是很方便的。当您需要决定触发哪个 segue 时,这将使生活更轻松。
1) 根据需要创建单独的 Controller ,并始终使用 Any/Any size 类设计 View 来创建大部分设计。我开始使用不同的设计 View ,但发现管理起来太棘手了。特别是当某些 Controller 可能出现在弹出窗口中时,iPad 上的尺寸等级(紧凑宽度)与主屏幕上的尺寸等级(常规宽度)不同。
2) 根据需要对单个约束、字体等使用大小类调整。
3) 对于可能出现在弹出窗口中的任何 View Controller ,在其前面加上一个 UINavigationController 和一个 Storyboard ID,可以用作任何弹出窗口的根。
4) 对于 UISplitViewControllers,使用 showDetail 样式 segues 正常创建。
5) 对于在 Split View Controller 中用作详细 View 但在弹出窗口或 iOS7 上的 iPhone 上使用时可能还需要推送的 UIViewController,从它们各自的主细节 Controller 创建推送转场。仅当您通过弹出窗口或在 iOS7 上展示在 Split View中设计的内容时才需要此功能,而在 iPhone 上没有 Split View。
6) 在您的 Controller 之间创建转场,包括 iPad/iPhone 特定的转场。如果只有一种可能的转场,您可以使用 Storyboard激活。否则只需在 Controller 之间绘制 segues。
7) 对于按钮或单元触发 segues 的任何 Controller ,您添加目标操作而不是 segue 触发器。在这些操作中,您将手动调用适当的 segue。
8) 在目标 Controller 类型取决于显示模式类型的每个 View Controller 中,编写使用应用程序委托(delegate)运行模式属性的代码来决定使用哪个 segue,然后调用 peformSegueWithIdentifier
带有 segue 的标识符。
这些都不是特别漂亮,但它似乎是一个必要的邪恶,特别是如果你使用 Split View Controller 和弹出窗口。好处是您至少可以在一个地方看到所有内容。
关于ios - Storyboard + 尺寸等级 : How to implement different Segues, ViewControllers,针对不同设备/尺寸等级的 UserFlow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092218/
这可能是一个简单的“不可能”的答案,但我想确定一下。我目前正在使用 LibreOffice,但如果可以在 Excel 中使用,我可以切换。 我有一个包含几个表格的电子表格,每个表格都有不同数据的相同测
我有一个应用程序,并且在主gradle文件中编写: task myTask { def command = "wsimport -s src" + File.separator + "main
我正在尝试使用点云库从点云中分割一个平面,并且我有一些有关平面模型的先验信息(即法线应该类似于z轴,高度(d)应该大约为0) 。 有没有办法强制我的RANSAC算法选择与我先前模型相似的系数?我认为可
我正在为一个发票项目开发一个基于 excel 的设备数据库。每个独特的项目都有自己的工作簿,但我正在尝试构建一个模板工作簿来限制每个项目的发票中有多少手动工作。每件设备都有一个型号、序列号和允许的地址
嗨, friend 们,我正在开发位置查找应用程序,每次我进入 map 页面时,我都会收到如下警告: "Received memory warning. Level=1" 应用程序崩溃后,我不知道该怎
我在状态中设置了 score、topicTotal 和 level,我正在打印它们中的每一个。 topicTotal 是所有分数相加的最终分数,level 基于它们的 topicTotal。 scor
这个问题在这里已经有了答案: How can I change an element's class with JavaScript? (33 个答案) 关闭 4 年前。
是否可以根据条件扩展 Ember 类?像这样的事情: A.reopen({ if (condition) { init: function() { this.super();
我有以下 DataFrame,其中包含两组动物以及它们每天吃多少食物, df = pd.DataFrame({'animals': ['cat', 'cat', 'dog', 'dog', 'rat'
下面的代码尝试使用 mpi 查找数组的最大数量.但是我不断收到以下错误: Rank 2 in job 47 caused collective abort of all ranks. Exit sta
我在 Tensorflow 文档主页上找到以下关于在等级>2 时使用 matmul 操作的内容: https://www.tensorflow.org/api_docs/python/math_ops
我试图弄清楚如何将Android Library项目分发给某些Beta用户,但是在分发并将其用于示例项目时遇到了一些问题。我正在尝试分发AAR文件。 我的示例项目中的所有内容都可以正常编译,但出现错误
我收到了以下 gradle 构建文件 (gae.gradle),其中包含来自 SpringSource 的示例项目,但是当我尝试使用 gradle 运行它时: gradle gae 它生成错误: FA
我想知道基于我的数据库结构的排名: 我有一个模型 Post 属于一个名为 Edition 的模型(也是 one Edition 有很多 Post). 一个Post有很多Like。 我想根据特定 Edi
我试图在登录页面中向正文添加一个类“bodyLogin”,并在所有其他页面中将其删除。angular的方式应该怎么做? 最佳答案 正如 Jeremy 所建议的那样,我使用了 ng 类,但在自动设置 $
我从 PHPClasses 网站获得了以下 ELO 类。 $S2) { $E = 120 - round(1 / (1 + pow(10, (($R2 - $R1)
我是 Matlab/Octave 用户。 Numpy 文档说 array 比 matrix 更可取。有没有一种方便的方法来处理 rank-1 数组,而不需要不断地 reshape 它? 例子: dat
比如说,我使用 MPI 运行一个并行程序。执行命令 mpirun -n 8 -npernode 2 总共启动8个进程。即每个节点有 2 个进程,总共有 4 个节点。 (OpenMPI 1.5)。其中
我需要按分区(或组)对行进行排名,即如果我的源表是: NAME PRICE ---- ----- AAA 1.59 AAA 2.00 AAA 0.75 BBB 3.48 BBB 2.19 B
我必须从文件中填充 CMake 变量缓存。 我在defaultConfig.externalNativeBuild.cmake.arguments(-C options.cmake)中添加了一个参数。
我是一名优秀的程序员,十分优秀!