我将一个imageView添加到applicationDidEnterBackground中我应用程序的主窗口中:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"splashimage.png"]];
splash.frame = self.window.bounds;
[self.window addSubview:splash];
}
我希望当我按下设备的主页按钮将应用程序置于后台,然后通过双击主页按钮查看任务管理器时,我会看到splashimage.png显示。但似乎应用程序进入后台时拍摄的屏幕截图不包含此叠加图像视图。我认为它会,因为我添加了没有动画的imageView。
为什么会发生这种情况?
更新:即使我在applicationDidEnterBackground中隐藏了我的窗口,在应用程序进入后台状态后,我仍然可以在任务管理器中看到未隐藏的完整窗口。当我按下主页按钮后,应用程序从后台返回后,窗口才会隐藏。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
//this does not work either!
self.window.hidden = YES;
}
更新:顺便说一句,我确实理解applicationDidEnterBackground有5秒钟完成。我现在只用
进行测试self.window.hidden = YES;
在applicationDidEnterBackground中,在applicationWillResignActive中没有任何内容,当应用程序进入后台时,窗口仍未隐藏;只有当它返回到前景时。所以这告诉我,在我的应用程序的某个地方必须有其他东西,不允许在applicationDidEnterBackground中发生这种情况。顺便说一句,如果我移动
self.window.hidden = YES;
到applicationWillResignActive,当应用程序进入后台时隐藏窗口。但我想弄清楚什么会阻止应用程序在applicationDidEnterBackground中完成这个单一,简单,非动画的任务。任何想法都赞赏。
更新:此特定问题与使用BannerViewController(iAd)有关。我在UITabBarController中使用它。尚不确定究竟是什么问题,或者它是否与UITabBarController中的使用有关。
更新:我认为这个问题与UITabBarController无关,但通常是BannerViewController(iAd)。现在要明白为什么......
更新:BannerViewController.m中的这一行导致了问题:
[self.view addSubview:bannerView]
在这种方法中:
- (void)viewDidLayoutSubviews
{
CGRect contentFrame = self.view.bounds, bannerFrame = CGRectZero;
ADBannerView *bannerView = [BannerViewManager sharedInstance].bannerView;
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
NSString *contentSizeIdentifier;
// If configured to support iOS <6.0, then we need to set the currentContentSizeIdentifier in order to resize the banner properly.
// This continues to work on iOS 6.0, so we won't need to do anything further to resize the banner.
if (contentFrame.size.width < contentFrame.size.height) {
contentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
} else {
contentSizeIdentifier = ADBannerContentSizeIdentifierLandscape;
}
bannerFrame.size = [ADBannerView sizeFromBannerContentSizeIdentifier:contentSizeIdentifier];
#else
// If configured to support iOS >= 6.0 only, then we want to avoid currentContentSizeIdentifier as it is deprecated.
// Fortunately all we need to do is ask the banner for a size that fits into the layout area we are using.
// At this point in this method contentFrame=self.view.bounds, so we'll use that size for the layout.
bannerFrame.size = [_bannerView sizeThatFits:contentFrame.size];
#endif
if (bannerView.bannerLoaded) {
contentFrame.size.height -= bannerFrame.size.height;
bannerFrame.origin.y = contentFrame.size.height;
} else {
bannerFrame.origin.y = contentFrame.size.height;
}
_contentController.view.frame = contentFrame;
// We only want to modify the banner view itself if this view controller is actually visible to the user.
// This prevents us from modifying it while it is being displayed elsewhere.
if (self.isViewLoaded && (self.view.window != nil)) {
[self.view addSubview:bannerView];
bannerView.frame = bannerFrame;
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
bannerView.currentContentSizeIdentifier = contentSizeIdentifier;
#endif
}
}
如果我还想使用BannerViewController,如果有什么可以修复的话,不完全确定原因或内容。
更新:从下面接受的答案,以下是解决这个问题的方法(bannerVC是对BannerViewController的引用)。
- (void)applicationWillResignActive:(UIApplication *)application {
[bannerVC.view snapshotViewAfterScreenUpdates:YES];
}
更新:我意识到这段代码应该在applicationDidEnterBackground中。但是,AdBannerView似乎没有办法及时制止动画,以免发生这种情况。所以就目前而言,在我的理解中,applicationWillResignActive就是剩下的一切,但它让用户得到了一个小于&#39;经验。我很感激有关如何停止AdBannerView动画的任何建议,以便快照可以显示在applicationDidEnterBackground中,而不仅仅是从后台返回时。
更新: 复制问题:
如果您已将applicationWillResignActive中的代码留意并且applicationDidEnterBackground中的代码未注释,则您将不会在任务管理器中看到蓝色闪屏。但是如果你在applicationDidEnterBackground中注释了代码并取消注释applicationWillResignActive中的代码,你应该在任务管理器中看到蓝色的启动画面。然而,这是不可取的。问题是如何在applicationDidEnterBackground方法中显示启动画面。
- (void)applicationWillResignActive:(UIApplication *)application {
//works - but undesirable
//[self addDummyView];
//[_tabBarController.view snapshotViewAfterScreenUpdates:YES];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
//does not work - needs to work to show dummyview only when application actually goes into the background
[self addDummyView];
[_tabBarController.view snapshotViewAfterScreenUpdates:YES];
}
- (void)addDummyView {
UIView *topView = _tabBarController.view;
UIView *colorView = [[UIView alloc] initWithFrame:topView.frame];
[colorView setBackgroundColor:[UIColor blueColor]];
[topView addSubview:colorView];
[topView bringSubviewToFront:colorView];
}
答案 0 :(得分:2)
当applicationDidEnterBackground方法返回时,应用程序的当前视图的快照将用于多任务视图。您没有看到更新的原因是因为快照是在绘制周期之前拍摄的。即使您调用setNeedsDisplay,仍然会拍摄快照。
要等到视图更新(添加子视图后),请调用:
[self.view snapshotViewAfterScreenUpdates:YES];
的值为YES
。这会强制您首先进行渲染。您可以在此处阅读有关处理Apple文档中此类内容的更多信息:3
答案 1 :(得分:1)
你可以在这里得到答案:Show splash screen when application enters background。
将您的代码保存在applicationWillResignActive中。
答案 2 :(得分:0)
你的代码很好。您应该知道双击主页按钮时未调用applicationDidEnterBackground
。当您切换到另一个应用程序或转到跳板时会调用它。
因此,您应该只按一次主页按钮,然后双击它,您的应用程序的屏幕截图应该有图像视图。我在测试项目中复制了你的用例,它对我有用。
如果它仍然不起作用,您应该看看图像视图的图像是否为零。哦,请不要隐藏应用程序窗口。