ios – 在app从背景返回之前,applicationDidEnterBackground中添加的视图不可见

ios – 在app从背景返回之前,applicationDidEnterBackground中添加的视图不可见,第1张

概述我在applicationDidEnterBackground中将imageView添加到我应用程序的主窗口: - (void)applicationDidEnterBackground:(UIApplication *)application{ UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage i 我在applicationDIDEnterBackground中将imageVIEw添加到我应用程序的主窗口:

- (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就是剩下的一切,但它给用户留下了“不足”的体验.我很感激有关如何停止AdBannerVIEw动画的任何建议,以便快照可以显示在applicationDIDEnterBackground中,而不仅仅是从后台返回时.

更新:
复制问题:

>下载iAdSuite
>打开TabbedBanner示例.
>将以下代码添加到AppDelegate:
>运行应用程序. (框架搞砸了,因为它还没有更新,但这个例子仍然会显示问题)
>点击主屏幕按钮一次,将应用程序置于后台.
>双击主页按钮以在任务管理器中查看应用程序.

如果您已将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];}
解决方法 当applicationDIDEnterBackground方法返回时,应用程序的当前视图的快照将用于多任务视图.您没有看到更新的原因是因为快照是在绘制周期之前拍摄的.即使您调用setNeedsdisplay,仍然会拍摄快照.

要等到视图更新(添加子视图后),请调用:

[self.vIEw snapshotVIEwAfterScreenUpdates:YES];

值为YES.这会强制您首先进行渲染.你可以在这里阅读苹果文档中有关处理这类内容的更多信息:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html#//apple_ref/doc/uid/TP40007072-CH8-SW27

总结

以上是内存溢出为你收集整理的ios – 在app从背景返回之前,applicationDidEnterBackground中添加的视图不可见全部内容,希望文章能够帮你解决ios – 在app从背景返回之前,applicationDidEnterBackground中添加的视图不可见所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1046408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存