如何在iPad应用启动时检测方向,以便为闪屏动画做定向调整!

18

嗨,我有一个应用程序,有两个 *.png 文件作为默认闪屏:

Default-Landscape.png Default-Portrait.png

我的目标是在我的应用程序加载并准备好后,以动画方式消除此默认闪屏。

为了实现这一目标,我通常会使用一个 UIImageView,并提供一个默认的横屏或竖屏的图片(取决于设备方向),将其保持在屏幕上一段时间,然后将其动画移开。

我的问题是,如果我在应用程序启动时调用 [[UIDevice currentDevice] orientation]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

无论我将设备明确放置在横向方向上,答案始终是它处于垂直方向。我在模拟器和实际设备上都尝试了这种情况,但行为都是相同的。

有人知道如何解决这个问题或者还有其他方法吗?

谢谢!


@Horatiu Paraschiv,我也遇到了这个问题。你能帮我找到解决方案吗? - Yuvaraj.M
9个回答

5

我曾遇到过这个问题,我的解决方案是将一张图片设置为1024x1024,并将UIImageView的contentMode设置为UIViewContentModeTop,然后使用左右边距自动调整大小。只要你的纵向和横向默认图像具有相同的布局,那么这个方法就很有效。

为了澄清,以下是我使用的内容:

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

很好的想法——我最终也这样做了。 - Craig McMahon

3
您可以按照以下方式使用UIApplication statusBarOrientation:
if ( UIDeviceOrientationIsLandscape( [[UIApplication sharedApplication] statusBarOrientation] ))
    {
    // landscape code
    }
else
    {
    // portrait code
    }

3
为了解决这个问题,我将闪屏图像视图安装在一个允许两种方向的视图控制器中。虽然设备在启动时报告了错误的方向,但视图控制器似乎获得了正确的方向。

1

在开始时了解方向是什么 (UIDevice 方向在用户旋转设备前不起作用),拦截您的视图控制器中的 shouldAutorotateToInterfaceOrientation,它在开始时被调用,您就可以知道您的设备方向。


1
也许你可以在启动时显示一个黑色背景的空白视图,并将 [[UIDevice currentDevice] orientation] 放置在该视图的 viewDidAppear 中,然后从那里开始你的闪屏。

1
这样做可以实现你想要的效果,但它违反了iOS HIG中的指南——启动图像不应该被用作闪屏,并且iOS应用程序不应该使用闪屏。 - Alex Martini

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

-1

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

以下是我用于淡出适当启动屏幕图像的代码:

    // 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];

注意:您需要更新它以支持高分辨率屏幕。

2
无法工作,[UIDevice currentDevice] orientation] 在启动画面中是“未定义”的。 - Kendall Helmstetter Gelner

-1

有时您希望在用户控制应用程序之前先从加载图像过渡到其他内容。除非您的应用程序非常简单,否则仅从加载图像转到着陆页面可能不足以使应用程序体验良好。如果您开发了一个大型应用程序,肯定会想要在设置、加载xibs等期间显示进度。如果应用程序需要几秒钟的准备时间而没有反馈,则用户会讨厌它。在我看来,一个好的过渡效果也是没有问题的。几乎没有人将加载屏幕用于 Apple 建议的方式。我不知道您查看了哪些应用程序,它们显示了他们建议的“空 UI”类型的加载屏幕。甚至 Apple 自己也不这样做,除了在他们的示例代码中,我的客户中没有人会接受这种设计。这是一种无聊的设计。


1
额,那个是回应Alex的。 - Dave

-2

听起来你似乎没有按照苹果在iOS HIG中推荐的方式使用启动图像。它明确指出,您不应将其用作闪屏,而是应将其用作实际 UI 的骨架版本。净效果是您的应用程序似乎准备就绪的速度更快。

建议您在视图DidAppear或类似功能中启动应用程序后自己绘制闪屏也错过了启动图像的基本目的。这不是一个闪屏。如果您的应用程序准备就绪,请让用户与其交互,不要浪费他们的时间绘制闪屏。

从我对苹果应用程序和第三方应用程序进行的五分钟调查中得出的结论是,每个人都显示肖像启动图像,加载肖像版本的 UI,然后旋转到横向。我已经有一段时间没有在 iOS 上编程了,但我想这反映了方法调用的顺序 - 首先启动您的应用程序,然后告诉它旋转到特定方向。

这可能是向苹果提出的不错的增强请求 :)


感谢您提供详细的回复。不过,我有不同的看法。苹果建议您使用应用程序的骨架版本来欺骗用户,让他们认为应用程序加载比实际快。除了这个小技巧之外,大多数应用程序都会使用公司标志或其他吸引人的内容作为启动画面,以吸引用户的注意力,直到应用程序准备就绪。 - Horatiu Paraschiv
我想要做的是让启动画面和我的UI之间的过渡更加平滑(添加特效),从而改善用户体验。 过渡时间最多为0.3-0.5秒,因此我认为用户不会觉得这是浪费他们的时间。 - Horatiu Paraschiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接