【问题标题】:Adaptive launch screen storyboards: is there a way to differentiate iPad orientations?自适应启动屏幕故事板:有没有办法区分 iPad 方向?
【发布时间】:2014-10-20 07:13:06
【问题描述】:

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

那么,在将自适应故事板用于启动屏幕时,有什么方法可以区分纵向 iPad 和横向 iPad?因为它是一个启动屏幕,我无法运行任何代码,所以必须完全通过情节提要完成。

【问题讨论】:

  • 您应该能够在您的 launchScreen.xib 中使用尺寸类来实现这一点?
  • @Chris iPad 尺寸等级在纵向和横向时都是常规高度和常规宽度......所以这是我的问题,你如何区分?
  • 您可以通过添加两个图像来做到这一点,然后在图像之间使用“占位符”视图并说上边框,这样当在横向时,一个图像有效地移出屏幕而另一个停留。
  • @SeanR,如果使用较旧的方法,设置 lauch 图像(我们可以设置纵向和横向 lauch 图像)不使用 size 类,这是否符合您的问题。

标签: ios adaptive-ui


【解决方案1】:

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

您不能为不同的屏幕尺寸(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)配置图像。

【讨论】:

  • 在 iOS 12 和 14 上不适合我(出现黑色启动屏幕)。 13号就好了。有什么线索吗?
【解决方案2】:

Apple 现在鼓励您不要从设备方向的角度来考虑旋转,而只是将其视为动画边界的变化(有时带有语义提示)。

我们看到了 iPhone 6 Plus 的原因——过去的“手机纵向”界面在某些手机上变成了横向的侧边栏界面。

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

另外,UIDeviceOrientationUIInterfaceOrientation 不同。如果您使用前者来做出 UI 决定,那么当设备正面朝上或正面朝下时您会受到阻碍,并且 (IIRC) 当您的应用程序不遵守方向锁定时,您的用户会感到沮丧。

那么横向和纵向 iPad 有什么区别?两者在特征上都是常规 x 常规...但是一个边界的高度大于宽度,反之亦然。完全可以根据纵横比做出高级布局决策(并使用自动布局获取细节)。

【讨论】:

  • 那么,就启动图像情节提要而言,没有办法为 iPad 方向设置不同的启动图像吗?因为如果需要签入代码,则不会为启动图像故事板完成这些操作。
  • 啊,我错过了您正在专门查看发布故事板。抱歉,我不知道如何自定义方向。 (我不知道这是否意味着没有,但无论如何file a bug 可能不是一个坏主意。)
【解决方案3】:

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

下面是一个快速的分步示例,说明如何为支持横向启动屏幕的设备指定横向图像:

  1. 首先将您的“启动画面”图像添加到您的项目Assets.xcassets。您应该只需要两个单独的Image Sets:一个用于portrait,一个用于landscape。将它们命名为 splash(这是纵向图像集)和 splash-landscape(这是横向图像集)。
  2. 现在您的项目中有图像assets,请转到您的LaunchScreen.storyboard 文件。 (我假设您已经使用图像设置了启动屏幕视图控制器,并且在 LaunchScreen.storyboard 中设置了约束。)
  3. 选择启动屏幕viewcontroller中的ImageView
  4. 转到Assets Inspector 以获取ImageView
  5. 将“splash”图像添加到Image 源字段。这是您的肖像图片来源。
  6. 点击您在第 5 步中设置的 Image 源字段旁边的 + 按钮。
  7. 从现在显示的弹出窗口中为 WidthHeight 选择器选择 Regular。这是为横向的 iPad 指定一个新的自适应集。将出现一个新的图像源字段,标题为 wR hR。将“splash-landscape”图像添加到 wR hR Image 源字段,以便 storyboard 在横向时知道使用不同的图像。
  8. 现在我们需要在横向模式下添加对“iphone plus”设备的支持。所以再次点击Image源字段旁边的+按钮。
  9. 这次为height 选择compact,为width 选择器选择regular。这是为landscape 中的“iPhone plus”设备指定一个新的自适应集。将出现一个新的图像源字段,标题为 wR hC
  10. 将“splash-landscape”图像添加到wR hC Image 源字段,以便storyboard 知道在“iphone plus 设备”上处于横向时使用不同的图像。

通过执行这些步骤,您不必编写任何代码、做任何奇怪的事情或依赖旧的launchScreen image setsLaunchScreen.storyboard 将为您处理一切!挺好看的。

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

编辑:这只是我认为我使用单独的图像集、自适应集和约束使 SplashScreen 图像工作的一个简短的人为示例。它花了 很多 的时间才能让它工作(几乎是一整晚,然后是一些)。很难一步一步地解释Interface Builder 及其所有不同方面。因此,请使用此答案和示例作为到达您需要去的地方的指南。此外,上面的链接非常有帮助。还有,谁知道呢,也许我只是错了或误解了什么......

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

【讨论】:

  • 这是一个很好的答案,而且信息量很大。但是我是否正确,因为它们都是常规高度/常规宽度,所以无法区分 iPad 纵向和 iPad 横向?
  • hmmm,我不知道你是否可以在运行时使用它在两者之间“区分”,但是通过使用这里描述的技术,你应该能够指定不同的图像/约束/大小/etc 当 iPad 处于纵向或横向时。我很确定我的项目确实做到了这一点(当 iPad 处于横向时,它指定了更大的图像尺寸)。如果您正在寻找一种在运行时处理/弄清楚这些事情的方法,那么这个答案可能不是,因为它只允许您指定应用程序在这些不同情况下的作用(无需编写代码或任何东西)。
  • 我尝试了您的解决方案,“splash-landscape”图像以纵向和横向形式出现在 iPad 上。因为 iPad 在横向和纵向都是 wR hR,所以它使用指定的 wR hR 图像。因此,在您的示例中,“splash”只会出现在 wC hR 大小类中。所以,是的,我仍然倾向于为横向和纵向 iPad 启动屏幕提供不同的图像。
  • 有没有人解决这个问题?如果是,您能否向我们展示示例启动屏幕?
  • 如果 iPad 单独启动纵向和横向,您将如何定义图像尺寸?例如:iPad 9.7 纵向尺寸为 768x1024,横向尺寸为 1024x768。 (图像会被拉伸)在这里你将如何给出两个不同的图像?
【解决方案4】:

设备方向非常简单,可以即时检查,并且还可以接收方向更改的通知。

(这里的一切都在 Objective-C 中)

前往您的 App Delegate,并在您的 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];
}

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

所以,在您的应用委托中的某个地方...

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

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

【讨论】:

  • 谢谢,我知道如何在代码中获取方向。我想知道如何使用自适应大小类区分 iPad 方向,特别是对于启动故事板。
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多