我正在研究使用故事板为我的应用程序启动图像。该应用程序一直使用一张大照片作为启动图像,它也用作第一个视图的背景。但是,当应用程序在 iPad 上横向启动时,图像会有所不同。
那么,当使用自适应故事板作为启动屏幕时,有什么方法可以区分纵向 iPad 和横向 iPad?因为它是一个启动屏幕,所以我不能运行任何代码,它必须完全通过情节提要完成。
我正在研究使用故事板为我的应用程序启动图像。该应用程序一直使用一张大照片作为启动图像,它也用作第一个视图的背景。但是,当应用程序在 iPad 上横向启动时,图像会有所不同。
那么,当使用自适应故事板作为启动屏幕时,有什么方法可以区分纵向 iPad 和横向 iPad?因为它是一个启动屏幕,所以我不能运行任何代码,它必须完全通过情节提要完成。
如今,Apple 鼓励您不要从设备方向的角度来考虑旋转,而是将其视为动画边界的变化(有时带有语义提示)。
我们看到了 iPhone 6 Plus 的原因——过去的“手机纵向”界面在某些手机上变成了横向的侧边栏界面。
您的视图控制器对设备及其方向的假设越多,就越难适应提供重用视图控制器的新方法的新设备。
还有,UIDeviceOrientation
不一样UIInterfaceOrientation
。如果您使用前者来做出 UI 决定,那么当设备正面朝上或正面朝下时,您会受到阻碍,并且 (IIRC) 当您的应用程序不遵守方向锁定时,您的用户会感到沮丧。
那么横向和纵向 iPad 有什么区别呢?两者在特征上都是常规 x 常规...但是一个边界的高度大于宽度,反之亦然。完全可以根据纵横比做出高级布局决策(并使用自动布局获取细节)。
我找到了一个使用间隔视图的解决方案,该视图将正确的图像定位在可见区域并将另一个图像移出屏幕(如David H所建议)。
您无法为不同的屏幕尺寸(iPhone 4、iPhone X、...)提供不同的图像,但如果您想要iPhone 和 iPad的不同图像以及纵向和横向的不同图像,此解决方案适合您。
如果您想尝试一下,我在 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
whereview.width
和view.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)配置图像。
您实际上可以LaunchScreen.storyboard
从with内部指定不同的启动屏幕图像Xcode8
。当目标设备运行及以上时,使用 aLaunchScreen.storyboard
是指定启动屏幕的首选方式。iOS8
下面是一个快速的分步示例,说明如何为支持横向启动屏幕的设备指定横向图像:
Assets.xcassets
中。您应该只需要两个单独Image Sets
的:一个 forportrait
和一个 for landscape
。将它们命名为splash
(这是肖像图像集)和splash-landscape
(这是风景图像集)。assets
转到您的LaunchScreen.storyboard
文件。(我假设您已经使用图像设置了启动屏幕视图控制器,并且它的约束设置在LaunchScreen.storyboard
.)ImageView
启动屏幕中的viewcontroller
.Assets Inspector
_ImageView
Image
源字段。这是您的肖像图像源。+
的源字段旁边的按钮。Image
Regular
和选择Width
器Height
。这是为横向的 iPad 指定一个新的自适应集。将出现一个带有标题的新图像源字段wR hR
。将“splash-landscape”图像添加到wR hR Image
源字段,以便storyboard
知道在风景中使用不同的图像。+
旁边的按钮。Image
compact
和height
选择regular
器width
。这是为位于landscape
. 将出现一个带有标题的新图像源字段wR hC
。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
一步一步地解释它的所有不同方面。因此,请使用此答案和示例作为到达您需要去的地方的指南。此外,上面的链接非常有帮助。另外,谁知道呢,也许我只是错了或误解了什么......
希望有人会觉得这很有帮助。
设备方向非常简单,可以即时检查,并且还可以接收方向更改的通知。
(这里的一切都在 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
}
}
这就是它的全部。然后,您可以使用该方法更改背景图像!