1

我花了很多时间在这上面,但我找不到完美的解决方案。

我正在制作一个包含一堆项目的表格视图的应用程序。如果您单击一个项目,它会打开一个带有网页的 Webview 控制器,这个视图中有一个后退按钮。

我通过我制作的 API 获取这些项目的数据。这可能需要一些时间,因此在从 API 加载项目时我需要一个加载屏幕。但是,当项目同步并且上次同步时间不超过 X 时间时,它不应该执行 API 调用,而只是从 Core Data 中获取它(在 API 调用之后存储它)。

现在我正在为加载屏幕而苦苦挣扎。一些要求:

  • 如果需要同步数据,应直接出现加载屏幕:
    • 当应用程序启动时,或
    • 当您单击 Webview 中的后退按钮时,或
    • 应用程序被置于后台并以表视图作为活动视图重新出现在前台
  • 如果数据不需要同步,表格视图应该直接出现在与上一点相同的情况下
  • 从加载屏幕到 Table View 的过渡动画应该是 Cross Dissolve。
  • 我打算让加载屏幕有一个带有一些照片的滑块,所以它不能只是一个叠加图像

    我第一次尝试是这样的:

加载屏幕作为推送序列

这里的加载屏幕是导航控制器之后的第一个视图。如果数据同步,我将 segue 调用到表视图(在 中viewWillAppear)。如果数据未同步,它将等待直到同步。在viewWillAppearTable View Controller 的方法中,我还检查是否需要完成同步(以防你从 Webview 回来,或者 App 进入前台),如果是,我调用[self.navigationController popViewControllerAnimated:NO](所以它会返回加载屏幕)。

这很好用,从 Webview 到加载屏幕的动画很流畅,我看不到中间的表格视图。但我不能修改动画,因为它是一个推动。所以我不能有溶解动画。

所以我尝试了一种不同的方法:

带有模态序列的加载屏幕

在这里我做了模态segues。在从表格视图到加载屏幕的一个上,我禁用了动画,在从加载屏幕到导航控制器的那个上,我给了 Cross Disolve 过渡。它需要回到导航控制器,否则我在表格视图中没有导航控制器。

在表格视图中,我再次检查数据是否需要同步,如果需要,则转到加载屏幕。但是,这次我需要这样做,viewDidAppear因为加载屏幕尚未出现viewWillAppear,当您将应用程序置于后台时,它会发出警告,等到 X 时间过去(因此它会同步)并将再次应用到前台。这是我得到的警告:

Warning: Attempt to present <BWLoadingScreenViewController: 0x829e2b0> on <UINavigationController: 0x856a6b0> whose view is not in the window hierarchy!

所以我使用viewDidAppear并且我没有警告,但是,这种方法也有一个缺点:

  • 当我从 Webview 返回并且 X 时间已经过去(所以它会同步)时,我看到推送动画首先进入表格视图,然后它闪烁到加载屏幕,非常丑陋......

现在我当然可以在所有地方使用手动转场,在每次转场之前检查数据是否需要同步,如果需要同步到加载屏幕而不是另一个,但是对于这么简单的事情来说,这将变得非常复杂,而且我还希望有一个通用的地方来检查是否需要完成同步并显示加载屏幕。

有没有人知道如何以一种干净利落的方式解决这个困境?非常欢迎提出建议。我对 iOS 开发还是很陌生,所以也许你可以给我一些新的见解。如果您想了解有关我的设置的更多信息,请询问我。

4

2 回答 2

0

您可以直接将加载屏幕(UIImageView例如 an )添加到您的 MasterViewController (需要是 aUIViewController而不是 a UITableViewController),只需执行以下操作:

myImageView.hidden = NO;

或者

myImageView.hidden = YES;

取决于您是否从 API 获取数据。你也可以做多个对象(例如添加一个UIActivityIndicatorView

于 2013-06-10T16:01:30.743 回答
0

好的,我设法找到了一种方法。

我发现您可以在进行推送的同时拥有自定义的转场动画。在这篇小文章的帮助下:http: //blog.jambura.com/2012/07/05/custom-segue-animation-left-to-right-using-catransition/

基本上你制作了一个自定义的 segue 类:

标题:

#import <UIKit/UIKit.h>

@interface BWLoadingScreenSegue : UIStoryboardSegue

@end

执行:

#import "BWLoadingScreenSegue.h"
#import "QuartzCore/QuartzCore.h"

@implementation BWLoadingScreenSegue

- (void)perform
{

    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];

    CATransition* transition = [CATransition animation];
    transition.duration = .25;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;

    [sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [sourceViewController.navigationController pushViewController:destinationController animated:NO];

}

@end

您需要将 QuartzCore 框架添加到您的链接框架中才能完成这项工作。然后你可以选择segue,选择'Style'='Custom'和'Segue Class'=你的segue类名(上面有代码)。现在,由于该方法pushViewController,它仍然是一个推送,并且由于transition.type = kCATransitionFade;它是一个淡入淡出过渡。非常好。

您可以选择更多过渡,例如:

kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
kCATransitionFade
于 2013-06-11T15:14:29.533 回答