启动屏幕的行为与启动图像完全相同

时间:2015-11-13 20:52:08

标签: ios xcode interface-builder

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为每个设备维度和启动方向定义特定的静态图像。 / p>

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

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

2)我没有办法为iPad Portrait和iPad Landscape视图选择不同的UIImage。大小类似乎认为iPad Portrait和iPad Landscape都是“Regular”宽度和“Regular”高度,因此任何出现在iPad Portrait上的UIImage也会出现在iPad Landscape中。

5 个答案:

答案 0 :(得分:4)

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

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

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

3.启动文件只能使用基本的UIKit视图,如UIImageView和UILabel。您无法使用UIWebView。

4.如果您使用的是故事板,则可以指定多个视图控制器,但还有一些限制。例如,您可以在导航或标签栏控制器中嵌入视图控制器,但更复杂的容器类(如UISplitViewController)不起作用(至少现在还没有)。

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

6.您无法为iPad和iPhone指定不同的启动文件。如果这些设备的界面明显不同,则可能会出现问题,因为您只能使用自动布局和大小类。

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

答案 1 :(得分:2)

  1. 首先创建所有图像。然后,打开资产目录并右键单击 - >应用程序图标&启动图像 - >新的iOS启动图像。这将创建一个文件以将所有文件拖入。去做。将资产命名为“启动”。 enter image description here

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

  3. 在Launch Screen故事板中,选择视图控制器的视图

  4. [selecting the view

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

      1. 现在,在故事板中选择图像视图,然后从资产目录中键入图像的名称。
      2. enter image description here

        1. 控制从UIImageView拖动到它的容器视图以设置自动布局约束,如下所示:
        2. enter image description here

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

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

          3. 清理并运行。

          4. 希望有所帮助,我没有忘记任何事情!

答案 2 :(得分:2)

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

答案 3 :(得分:0)

这是适用于iPad的解决方案,

对于iPhone,您可以使用大小类,我不会在此处发布该解决方案。

解决方案是将启动画面图像分解为组件,并使用约束来操纵Portrait与Landscape的图像。

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

为iPad创建启动故事板

UILaunchStoryboardName~ipad(UILaunchStoryboardName~iphone)

在我的案例中拍摄风景照片2048x1536

我拍摄了风景图片并将其剪切成三个

  1. 中心1536x1536
  2. 左256x1536
  3. 右256x1536
  4. 在发布故事板上,我使用以下约束创建了3个图像视图

    中心篇:

    • Pin to Top and bottom,
    • 以superview为中心,
    • 保持宽高比

    左和右右图:

    • 0尾随/通往中心,
    • Align Top,
    • 等高

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

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

答案 4 :(得分:0)

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

您无法针对不同的屏幕尺寸(iPhone 4,iPhone X等)提供不同的图像,但是如果您想要 iPhone和iPad的不同图像纵向和横向。该解决方案适合您。

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

Constraints in Interface Builder

重要的约束条件是

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)配置图像。