15

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

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

4

4 回答 4

4

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

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

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

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

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

于 2014-11-18T00:32:59.897 回答
4

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

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

如果您想尝试一下,我在 github 上创建了一个示例项目。它适用于 iPad 和 iPhone。

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

whereview.widthview.height是主视图的宽度和高度。

PortraitSpacer纵向图像的位置 ,横向图像5 × min(view.width, view.height)的位置, 和 的宽度与纵向模式相同,宽度与横向模式相同。LandscapeSpacer5 × max(view.width, view.height)PositionSpacerPortraitSpacerLandscapeSpacer

我们将所有内容乘以 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)配置图像。

于 2019-04-23T15:25:02.330 回答
2

您实际上可以LaunchScreen.storyboard从with内部指定不同的启动屏幕图像Xcode8。当目标设备运行及以上时,使用 aLaunchScreen.storyboard是指定启动屏幕的首选方式。iOS8

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

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

通过执行这些步骤,您不必编写任何代码、做任何奇怪的事情或依赖旧的launchScreen image sets. 会LaunchScreen.storyboard为你处理一切!这很整洁。

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

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

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

于 2017-09-07T07:00:14.283 回答
1

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

(这里的一切都在 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
    }
}

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

于 2014-11-18T00:04:44.637 回答