自适应启动屏幕故事板:有没有办法区分iPad方向?

时间:2014-10-20 07:13:07

标签: ios adaptive-ui

我正在研究使用故事板为我的应用启动图像。该应用程序始终使用大型照片作为启动图像,该照片也用作第一个视图的背景。但是,当应用程序在iPad上以横向方式启动时,图像会有所不同。

当使用自适应故事板作为发布屏幕时,有没有办法区分纵向iPad和横向iPad?因为它是一个启动屏幕,我无法运行任何代码,所以必须完全通过故事板完成。

4 个答案:

答案 0 :(得分:4)

Apple现在鼓励你不要在设备方向方面考虑旋转,而是像动画边界一样改变(有时带有语义提示)。

我们看到了为什么iPhone 6 Plus - 曾经是“手机,肖像”的界面在某些手机上成为横向界面。

视图控制器对设备及其方向的假设越多,就越难适应新设备,这些设备提供了重用视图控制器的新方法。

此外,UIDeviceOrientationUIInterfaceOrientation不同。如果您使用前者做出UI决策,当设备面朝上或面朝下时,您将受到阻碍,并且(IIRC)当您的应用不尊重Orientation Lock时,您的用户会感到沮丧。

那么风景画和人像iPad有什么区别?两者都是常规x常规的特征......但是一个人的边界比他们的宽度更高,反之亦然。根据宽高比做出高级布局决策是完全可以的(并且使用自动布局来获取细节)。

答案 1 :(得分:2)

设备方向非常简单易于检查,并且还会收到方向更改的通知。

(这里的所有内容都在Objective-C中)

前往您的App代表,并在您的applicationDidFinishLaunchingMethod

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//
//then call this, what we're telling the device is, "Hey, let me know when you change orientations!"

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

    //Not done yet, now we have to register a method to call on the notification
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
}

现在,您将要定义设备定向时调用的方法。

所以,在你的app appate ...的某个地方......

- (void) deviceOrientationDidChange {
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation == UIDeviceOrientationPortrait) {
        //do something if portrait
    }
    else {
         //do another thing if landscape
    }
}

这就是它的全部内容。然后,您可以使用该方法更改背景图像!

答案 2 :(得分:2)

您实际上可以使用LaunchScreen.storyboardXcode8内部指定不同的启动屏幕图像。在定位运行LaunchScreen.storyboard及更高版本的设备时,使用iOS8是指定启动屏幕的首选方式。

以下是如何为支持横向启动屏幕的设备指定横向图像的快速分步示例:

  1. 首先将您的“启动画面”图像添加到项目Assets.xcassets中。您应该只需要两个单独的Image Sets:一个用于portrait,另一个用于landscape。将它们命名为splash(这是肖像图像集)和splash-landscape(这是横向图像)。
  2. 现在您的项目assets中有图像,请转到LaunchScreen.storyboard文件。 (我假设您已经使用图像设置了启动屏幕视图控制器,并在LaunchScreen.storyboard中设置了约束。)
  3. 选择启动屏幕ImageView
  4. 中的viewcontroller
  5. 转到Assets Inspector的{​​{1}}。
  6. 将“splash”图像添加到ImageView源字段。这是您的肖像图像来源。
  7. 点击您在步骤5中设置的Image来源字段旁边的+按钮。
  8. 从现在显示的弹出式窗口中为ImageRegular选择器选择Width。这是为横向的iPad指定一个新的自适应集。将出现一个标题为Height的新图像源字段。将“splash-landscape”图像添加到wR hR源字段,以便wR hR Image知道在横向时使用其他图像。
  9. 现在我们需要在横向时添加对“iphone plus”设备的支持。因此,再次点击storyboard来源字段旁边的+按钮。
  10. 此时为Image选择compact,为height选择器选择regular。这是为width中的“iPhone plus”设备指定新的自适应设置。将出现一个新的图像源字段,标题为landscape
  11. 将“splash-landscape”图像添加到wR hC源字段,以便wR hC Image知道在“iphone plus设备”中使用横向时使用其他图像。
  12. 通过执行这些步骤,您不必编写任何代码,做任何奇怪的事情,也不必依赖旧的storyboardlaunchScreen image sets将为您处理一切!它非常整洁。

    有关Size Classes和Interface Builder的更多信息,请查看精彩的文章:https://medium.com/@craiggrummitt/size-classes-in-interface-builder-in-xcode-8-74f20a541195

    编辑:这只是我想法的一个简短设计示例,我使用单独的图像集,自适应集和约束来使SplashScreen图像工作。为了让它发挥作用(几乎整晚,然后一些),花了很多时间搞乱了。很难在一步一步的帖子中解释LaunchScreen.storyboard及其所有不同方面。因此,请使用此答案和示例作为指导,以达到您需要的位置。此外,上面的链接非常有用。另外,谁知道,也许我错了或误解了什么......

    希望有人会觉得这很有帮助。

答案 3 :(得分:1)

我找到了一种使用间隔视图的解决方案,该视图将正确的图像放置在可见区域中,并将另一幅图像移出屏幕(如David H的建议)。

您无法针对不同的屏幕尺寸(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)配置图像。