如何检测 iPad 上启动屏幕动画的应用程序启动方向!

Posted

技术标签:

【中文标题】如何检测 iPad 上启动屏幕动画的应用程序启动方向!【英文标题】:How do I detect orientation on app launch for splash screen animation on iPad! 【发布时间】:2010-08-13 14:05:07 【问题描述】:

您好,我有一个应用程序,我有两个 *.png 用于默认启动画面:

默认横向.png Default-Portrait.png

我想要的是在我的应用程序加载完毕并准备好运行时为这个默认启动屏幕设置动画。

为了实现这一点,我通常会呈现一个具有默认横向或默认纵向(取决于设备方向)的 UIImageView,将其在屏幕上保持一段时间,然后将其动画化。

我的问题是,如果我在

中调用[[UIDevice currentDevice] orientation]
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

答案始终是设备是纵向的,即使我很清楚它是横向的。我在模拟器和设备上都试过了,行为是一样的。

有没有人知道解决这个问题或其他方法?

谢谢!

【问题讨论】:

您找到解决方案了吗? @Horatiu Paraschiv 我也有这个问题。你能帮我找到解决办法吗? 【参考方案1】:

我遇到了这个问题,我通过制作一张 1024x1024 的图像并将 UIImageView 的 contentMode 设置为 UIViewContentModeTop,然后使用左右边距自动调整大小来解决它。只要您的纵向和横向默认图像是相同的布局,就可以正常工作。

只是为了澄清这是我使用的:

bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:SplashImage]];
bgView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
bgView.contentMode = UIViewContentModeTop;

【讨论】:

好主意 - 我最终也这样做了。【参考方案2】:

为了解决这个问题,我在允许两个方向的视图控制器内安装了启动图像视图。尽管设备在启动时报告了错误的方向,但视图控制器似乎得到了正确的方向。

【讨论】:

【参考方案3】:

您可以按如下方式使用 UIApplication statusBarOrientation:

if ( UIDeviceOrientationIsLandscape( [[UIApplication sharedApplication] statusBarOrientation] ))
    
    // landscape code
    
else
    
    // portrait code
    

【讨论】:

【参考方案4】:

也许您可以在开始时显示一个带有黑色背景的空白视图并将[[UIDevice currentDevice] orientation] 放入此视图的viewDidAppear 并从那里启动您的启动画面?

【讨论】:

这可以工作并做你想做的事,但它违反了 ios HIG 中的指导方针——启动图像并不意味着是启动画面,iOS 应用程序不应使用启动画面屏幕。【参考方案5】:

另一种解决方案是读取加速度计数据并自行确定方向。

【讨论】:

【参考方案6】:

要在开始时知道什么是方向(UIDevice 方向在用户旋转设备之前不起作用)拦截您的视图控制器的shouldAutorotateToInterfaceOrientation,它在开始时被调用,并且您知道您的设备方向。

【讨论】:

【参考方案7】:

在用户控制您的应用之前,您肯定会想从加载图像转换到其他图像。除非您的应用程序非常简单,否则从加载图像到登录页面可能还不够,否则应用程序体验会非常糟糕。如果你曾经开发过一个大型应用程序,你肯定会想要在设置、加载 xib 等过程中显示进度。如果一个应用程序需要几秒钟来准备而没有反馈,用户会讨厌它。 IMO,好的过渡效果也没有错。几乎 没有人 使用 Apple 建议的加载屏幕。我不知道您查看的哪些应用程序显示了他们建议的“空 UI”类型的加载屏幕。哎呀,除了在他们的示例代码中,即使 Apple 也不会这样做,而且我的客户都不会认为这是可以接受的。这是一个蹩脚的设计。

【讨论】:

Eh.. 那是对 Alex 的回应。【参考方案8】:

操作系统仅旋转添加到窗口的第一个视图。因此,如果您希望启动画面自动旋转并且您的主视图是可旋转的,那么只需将其添加为该视图的子视图。

这是我用于淡出相应初始屏幕图像的代码:

    // Determine which launch image file
NSString * launchImageName = @"Default.png";
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) 
        launchImageName = @"Default-Portrait.png";
     else 
        launchImageName = @"Default-Landscape.png";
    


// Create a fade out effect
UIImageView* whiteoutView = [[[UIImageView alloc] initWithFrame:self.window.frame] autorelease];
whiteoutView.autoresizingMask = UIViewAutoresizingFlexibleWidth  | UIViewAutoresizingFlexibleHeight;
whiteoutView.autoresizesSubviews = YES;         
whiteoutView.image = [UIImage imageNamed:launchImageName];
[[[self.window subviews] objectAtIndex:0] addSubview:whiteoutView];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
whiteoutView.alpha = 0.0;
[UIView commitAnimations];

注意:您必须对其进行更新以支持高分辨率屏幕。

【讨论】:

不起作用,[UIDevice currentDevice] 方向] 是“未定义”,用于启动画面。【参考方案9】:

听起来您没有按照 Apple 在iOS HIG 中推荐的方式使用启动图像。它特别指出您不应将其用作启动屏幕,而应将其用作实际 UI 的骨架版本。最终效果是您的应用似乎准备就绪的速度要快得多。

应用程序在 viewDidAppear 或类似中启动后您可以自己绘制启动画面的建议也缺少启动图像的基本目的。这不是启动画面。如果您的应用已准备就绪,请让用户与之交互,不要浪费时间绘制启动画面。

在我对 Apple 应用和第三方应用的五分钟调查中,每个人都展示了一张纵向启动图像,加载了纵向版本的 UI,然后旋转为横向。自从在 iOS 上编程已经有一段时间了,但我认为这反映了方法调用的顺序——首先你的应用程序被启动,然后被告知旋转到特定的方向。

向 Apple 提交可能是一个不错的增强请求 :)

【讨论】:

感谢您提供书面回复。不过我确实有不同的看法。 Apple 建议您应该使用实际 UI 的骨架版本来欺骗用户应用加载速度比实际速度快。跳过这个小技巧,大多数应用程序使用带有公司徽标或有吸引力的东西的启动屏幕来吸引用户的注意力,直到应用程序准备好运行。 我想要做的是让启动屏幕和我的 UI 之间的过渡更平滑(添加效果),从而改善用户体验。过渡最多为 0.3-0.5 秒,所以我认为用户不会觉得这是在浪费时间。

以上是关于如何检测 iPad 上启动屏幕动画的应用程序启动方向!的主要内容,如果未能解决你的问题,请参考以下文章

iOS如何在屏幕外启动图像并将其动画到屏幕上

如何强制 iPad 启动 wifi 连接?

使用 javascript 检测 iPad 设备方向

为 iPhone 和 iPad 启动屏幕选择不同的背景图像

从 xcode 10.1 安装到 iOS 12+ 时,应用程序在启动屏幕上冻结

iPhone 应用程序被拒绝:首次启动 iPad 上的屏幕变白