【问题标题】:Launch Screen that behaves exactly like Launch Image行为与启动图像完全相同的启动屏幕
【发布时间】:2016-02-15 13:18:48
【问题描述】:

In order to get iPad Pro to use full resolution at launch, we have to use a Launch Screen File.

我以前从未使用过 Launch Screen XIB/Storyboard,因为我的应用向后兼容 iOS 7。通常我使用 LaunchImage asset catalog 为每个设备尺寸和启动方向定义特定的静态图像。

现在我正在尝试定义一个类似于 LaunchImage 资产目录的启动屏幕文件,但我很难做到。特别是:

1) 我没有看到根据设备的确切尺寸选择不同 UIImage 的好方法,例如向 iPhone 4S 用户显示一张图像,向 iPhone 5 用户显示另一张图像。

2) 我看不到为 iPad 纵向和 iPad 横向视图选择不同 UIImage 的方法。大小类似乎认为 iPad Portrait 和 iPad Landscape 都是“常规”宽度和“常规”高度,因此任何会显示在 iPad Portrait 上的 UIImage 也会出现在 iPad Landscape 中。

【问题讨论】:

  • 从 iOS 8 开始,支持一切的首选方式是使用启动屏幕、大小类和自动布局,而不是提供静态资源。您是否正在寻求实施启动屏幕的帮助?有很多关于此的文档。如果您需要继续支持 iOS 7,您需要为支持的设备提供静态资源,您是否需要同时支持 iOS 7 和 8/9 的帮助?
  • @Jessedc 实现一个行为与启动图像完全相同的启动屏幕非常困难,例如显示 iPhone 4S 与 iPhone 5 的不同静态图像。通常,我不会打扰;如果您想要启动图像,只需使用启动图像,对吗?为什么要打扰启动屏幕?好吧,iPad Pro 就是这个问题的答案。我必须使用启动屏幕来获得 iPad Pro 的全分辨率。所以现在我尝试在 Launch Screen 的上下文中复制 Launch Image 的优势。
  • 我很清楚,您是说您的要求是根据设备类型和启动方向显示完全不同的启动屏幕内容?此外,您的参考实现是通过拥有 Default.png 图像并相应地命名它们所展示的行为(例如 Default-Portrait@2x~ipad.png)。我说的对吗?
  • @Jessedc 是的。 (从技术上讲,我使用的是“LaunchImage”资产目录,但这是相同的想法。)我已经更新了问题以包含说明。
  • 这似乎是不可能的。我提出了另一个相关问题:Force iPad Pro to full resolution without Launch Screen

标签: ios xcode interface-builder


【解决方案1】:

另一种方法是使用间隔视图,将正确的图像定位在可见区域并将另一个图像移出屏幕(请参阅我对类似问题 here 的原始答案)。

您不能为不同的屏幕尺寸(iPhone 4、iPhone X 等)提供不同的图像,但如果您想要 iPhone 和 iPad 的不同图像不同的图像纵向和横向此解决方案适合您。

如果您想尝试一下,我创建了一个example project on github。 它适用于 iPad 和 iPhone。

重要的约束是

PortraitSpacer.width ≤ 5 × view.width
PortraitSpacer.width ≤ 5 × view.height

LandscapeSpacer.width ≥ 5 × view.width
LandscapeSpacer.width ≥ 5 × view.height

PositionSpacer.width = 5 × view.width

其中view.widthview.height 是主视图的宽度和高度。

PortraitSpacer 将纵向图像定位在5 × min(view.width, view.height)LandscapeSpacer 将横向图像定位在 5 × max(view.width, view.height)PositionSpacer 在纵向模式下与PortraitSpacer 的宽度相同,在横向模式下与LandscapeSpacer 的宽度相同。

我们将所有内容乘以 5,这样两个图像就不会重叠。这适用于满足以下条件的所有设备

5 × min(view.width, view.height) + max(view.width, view.height) ≤ 5 × max(view.width, view.height)

在横向模式下,这意味着

5 / 4 ≤ view.width / view.height

目前所有设备都是如此:iPad 的纵横比最低,为 4:3,但仍大于 5:4。

您当然可以在资产目录中为每个设备(iPhone、iPad)配置图像。

【讨论】:

  • 非常感谢这个解决方案!它非常适合我的应用程序——在所有模拟器设备上。这是一个超级简单的解决方案,只需要 4 张图像。 Jochen做了所有的努力;只需将他的 4 张图片替换为您自己的即可。
  • 很高兴听到这个消息!
【解决方案2】:

这是一个可以工作的iPad解决方案,

对于 iPhone,您可以使用尺寸等级,我不会在此处发布该解决方案。

解决方案是将初始屏幕图像分解为组件,并使用约束来处理纵向和横向的图像。

这是我如何做到的一个例子。

为 iPad 创建一个启动故事板

UILaunchStoryboardName~ipad (UILaunchStoryboardName~iphone)

在我的情况下以 2048x1536 拍摄你的风景图片

我拍了风景图,一分为三

  1. 中心 1536x1536
  2. 左 256x1536
  3. 右 256x1536

在启动故事板上,我创建了 3 个具有以下约束的图像视图

中心片:

  • 固定到顶部和底部,
  • 在superview中居中,
  • 保持纵横比

左右棋子:

  • 0 尾随/前导到中心,
  • 顶部对齐,
  • 等高

然后对于左右视图的模式,我将其从外观填充更改为右下角和左下角(对我来说效果最好)

我知道这对于应该很简单的事情来说似乎有点过头了。我使用启动故事板而不是启动图像的原因是为了减少应用程序的大小。我需要更少的启动图像,我可以使用 jpeg 而不是 png

【讨论】:

  • 有任何示例项目吗?
  • @karthikeyan,很遗憾,我没有,太远了
【解决方案3】:

您可以使用 Size Classes 为不同的屏幕尺寸指定不同的图像,但这无助于您处理 iPhone 4S 和 iPhone 5 屏幕的情况

【讨论】:

    【解决方案4】:

    系统在启动应用程序之前加载启动文件,这对其可以包含的内容产生了一些限制(其中一些可能会迫使您返回静态图像文件):

    1.应用尚未加载,因此视图层次结构不存在,系统无法调用您在应用中可能拥有的任何自定义视图控制器设置代码(例如 viewDidLoad)

    2.您只能使用标准的 UIKit 类,因此您可以使用 UIView 或 UIViewController 但不能使用自定义子类。如果您尝试设置自定义类,您将在 Xcode 中收到 Illegal Configuration 错误。

    3.launch文件只能使用UIImageView、UILabel等基本的UIKit视图。你不能使用 UIWebView。

    4.如果您使用情节提要,您可以指定多个视图控制器,但也有一些限制。例如,您可以在导航或标签栏控制器中嵌入视图控制器,但更复杂的容器类(例如 UISplitViewController)不起作用(至少目前还不起作用)。

    5.本地化启动文件目前似乎没有任何效果。始终使用基本本地化,因此您可能希望避免在启动屏幕上显示文本。

    6.您不能为 iPad 和 iPhone 指定不同的启动文件。如果您对这些设备有显着不同的界面,这可能是个问题,因为您只能使用自动布局和尺寸类做很多事情。

    请注意,如果您要部署到 iOS 7,您仍然需要包含静态启动图像文件。您可以同时包含启动映像文件和静态启动映像。运行 iOS 8 的 iPhone 6 等设备将使用启动图像文件,而 iOS 7 设备将回退到启动图像。

    【讨论】:

    • “你不能为 iPad 和 iPhone 指定不同的启动文件”:这不是真的。在Info.plist 中,您可以同时指定一个键UILaunchStoryboardName~iphone 和一个键UILaunchStoryboardName~ipad 来指定不同的启动屏幕。请参阅 Apple 官方文档中的 Information Property List Key Reference
    【解决方案5】:
    1. 首先创建所有图像。然后,打开您的资产目录并右键单击 -> App Icons & Launch Images -> New iOS Launch Image。这将创建一个文件以将所有文件拖入其中。去做。将资产命名为“启动”。

    2. 使用 command-n 创建一个新的启动屏幕故事板。选择 iOS -> 用户界面 -> 启动屏幕。将文件称为“启动屏幕”。

    3. 在您的启动屏幕故事板中,选择视图控制器的视图

    [.

    1. 从右侧ba下角的对象库中找到UIImageView占位符,并将其拖到启动屏幕视图中。

    1. 现在,在情节提要中选择图像视图,然后输入资产目录中的图像名称。

    1. 控制从 UIImageView 拖动到它的容器视图来设置自动布局约束如下:

    1. 可选...如果您希望它在故事板中看起来不错,请选择视图并执行 option-cmd-= 以更新 UIImageView 的框架。

    2. 转到您的 info.plist,然后输入故事板的名称(“启动 Screen") 键为“启动屏幕界面文件基本名称”

    3. 清理并运行。

    希望对您有所帮助,并且我没有忘记任何事情!

    【讨论】:

    • “需要添加更多信息以了解如何为不同的屏幕选择不同的图像”确实。具体来说,如果您能弄清楚如何为 iPhone 4S 与 iPhone 5 以及 iPad 纵向与 iPad 横向使用不同的图像(这两对都属于同一尺寸等级),您将获得赏金。
    • 查看第 1 步...应该是答案。我手头没有所有图像,因此无法对其进行测试。
    • 虽然这确实为 Retina HD 5.5 和 4.7 创建了新的资产占位符,但它似乎没有 iPad Pro 占位符。
    • 我认为这实际上行不通。我尝试在一个新的 Xcode 项目中按照您的说明进行操作;启用启动屏幕后,它只显示白屏而不是预期的启动图像。 github.com/dfabulich/repro
    • 我按照上面的步骤也得到了一个白屏。 XCode 似乎不允许在图像视图中选择.launchimage。我尝试将其切换为 .imageset,它在我的故事板上显示了该场景中的实际图像,但是当我启动时它仍然导致白色的空白启动图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多