若要在用户为您的应用设置背景时获取当前显示的视图,请使用您的 AppDelegate 的 applicationDidEnterBackground 方法。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Get current view...
// (get from UITabbarController or whatever logic you like)
// For this code sample, just grab first UIView under the main window
UIView *myView = [self.window.subviews objectAtIndex:0];
}
要在显示之前更改视图,请使用 AppDelegate 的 applicationWillEnterForeground 方法,如下所示:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 80, 80)];
label.backgroundColor = [UIColor whiteColor];
label.text = @"yo";
[self.myLastView addSubview:label];
}
我知道您在问题中提到了 applicationWillEnterForeground。您能否更具体地说明您正在尝试做什么或可能包含代码? 我实际上尝试了上面的代码和视图更新(我在视图上方看到了标签"yo")。
我的最后一个建议是尝试调用 [view setNeedsDisplay] 和 [view setNeedsLayout],这应该会强制 UIView 重新绘制自身。 (注意 - 问题不在于 uiview 更改不显示向上,问题是它们在显示旧视图后出现。似乎在暂停应用程序之前截取了屏幕截图,并且此屏幕截图最初是在恢复应用程序以提高性能时显示的)
编辑
上面的代码是用户看到的一个很好的例子。标签"yo" 出现,但仅在视图恢复之后。我会看看我是否可以解决这个问题并重新发布。
编辑 2
据我所知,恢复暂停的应用似乎会显示该应用最后已知状态的屏幕截图。我已尝试查找有关此效果的文档,但找不到。
替代方案 1
当用户点击主页按钮时,让您的应用退出。
如果您将应用程序的状态保存在 applicationWillResignActive: 或 applicationWillTerminate: 中,您可以简单地恢复该状态(导航到正确的选项卡用户上次打开)并在 appDidFinishLaunchingWithOptions: 中您可以在用户之前更新 UI看到它。要让您的应用在后台(暂停)时退出,请将密钥 "Application does not run in background" - raw key: UIApplicationExitsOnSuspend 设置为 YES。
这样做可以保证用户以他们在设置中配置的方式看到您的应用,而不会看到它过去的样子。很抱歉,我找不到更好的方法来做到这一点。 :(
替代方案 2
在您的应用中显示您的设置。
这显然需要更改设计,但是越来越多的应用在应用内显示设置。一个流行的第三方库是 In App Settings Kit。这使您可以像配置全局应用程序设置一样通过 bundle / plist 文件配置设置。它的外观和行为也与全局设置一样。这将使您可以完全控制您想要在应用中进行的任何行为。