Ios 创建同步时显示的加载屏幕,无延迟
我在这方面花了很多时间,但我找不到一个完美的解决方案 我正在制作一个应用程序,它有一个包含大量项目的表视图。如果你点击一个项目,它会打开一个带有网页的Webview控制器,在这个视图中有一个后退按钮 我通过自己制作的API获取这些项目的数据。这可能需要一些时间,所以在从API加载项目时,我需要一个加载屏幕。但是,当项目被同步并且上次同步的时间不超过X时间时,它不应该执行API调用,而只是从核心数据(API调用后存储在那里)获取它 现在,我正在与加载屏幕挣扎。一些要求:Ios 创建同步时显示的加载屏幕,无延迟,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我在这方面花了很多时间,但我找不到一个完美的解决方案 我正在制作一个应用程序,它有一个包含大量项目的表视图。如果你点击一个项目,它会打开一个带有网页的Webview控制器,在这个视图中有一个后退按钮 我通过自己制作的API获取这些项目的数据。这可能需要一些时间,所以在从API加载项目时,我需要一个加载屏幕。但是,当项目被同步并且上次同步的时间不超过X时间时,它不应该执行API调用,而只是从核心数据(API调用后存储在那里)获取它 现在,我正在与加载屏幕挣扎。一些要求: 如果需要同步数据,则应直
- 如果需要同步数据,则应直接显示加载屏幕:
- 当应用程序启动时,或
- 单击Webview中的backbutton时,或
- 应用程序放在背景上,并以表视图作为活动视图显示在前景上
- 如果不需要同步数据,则表视图应在与上一点相同的情况下直接显示
- 从加载屏幕到表视图的过渡动画应为交叉融合
- 我计划让加载屏幕有一个带有一些照片的滑块,所以它不能只是一个覆盖图像 我第一次是这样尝试的:
视图中将出现)。如果数据未同步,它将等待直到同步。在表视图控制器的视图将出现方法中,我还检查是否需要进行同步(如果您从Webview返回,或应用程序进入前台),如果需要,我调用[self.navigationController popViewControllerAnimated:NO]
(因此它返回到加载屏幕)
这很好,从Webview到加载屏幕的动画变得平滑,我看不到中间的表格视图。但是我不能修改动画,因为它是一个推送。所以我不能有溶解动画
所以我尝试了一种不同的方法:
在这里我做了模态分段。在从表格视图到加载屏幕的一个屏幕上,我禁用了动画,从加载屏幕到导航控制器的一个屏幕上,我给出了交叉分解转换。它需要返回到导航控制器,因为否则我在表视图中没有导航控制器
在表视图中,我再次检查数据是否需要同步,如果需要,则转到加载屏幕。但是,这一次我需要在viewdide
中执行此操作,因为加载屏幕尚未出现在viewwillbeen
中,当您将应用程序置于后台时,它会发出警告,等待X时间过去(因此它将同步),然后再次将应用程序置于前台。这是我得到的警告:
Warning: Attempt to present <BWLoadingScreenViewController: 0x829e2b0> on <UINavigationController: 0x856a6b0> whose view is not in the window hierarchy!
警告:尝试显示其视图不在窗口层次结构中的对象!
因此,我使用了viewdideappear
,没有警告,但是,这种方法也有一个缺点:
- 当我从Webview返回并且X时间已经过去(因此它将同步)时,我看到推送动画首先进入表格视图,然后它闪烁到加载屏幕,非常难看
现在我当然可以在所有地方使用手动分段,在每次分段之前检查数据是否需要同步,如果需要,则切换到加载屏幕而不是另一个屏幕,但对于这样一件简单的事情来说,这将变得非常复杂,我还希望有一个通用的地方,检查是否需要同步,并显示加载屏幕与否
有没有人知道如何以一种好的、干净的方式解决这个难题?欢迎提出建议。我对iOS开发还很陌生,所以也许你可以给我一些新的见解。如果您想了解有关我的设置的更多信息,请询问我。您可以将加载屏幕(例如,UIImageView
)直接添加到您的MasterViewController(需要是UIViewController
而不是UITableViewController
)并只需执行以下操作:
myImageView.hidden = NO;
或
取决于您是否从API获取数据。您还可以执行多个对象(例如添加UIActivityIndicatorView
)好的,我找到了一种方法
我发现你可以在推送的同时定制segue动画。借助这篇小文章:
基本上,您可以创建一个自定义segue类:
标题:
#import <UIKit/UIKit.h>
@interface BWLoadingScreenSegue : UIStoryboardSegue
@end
您需要将QuartzCore框架添加到您的链接框架中,以实现这一点。然后您可以选择segue,选择'Style'=“Custom”和'segue Class'=您的segue类名(上面有代码)。现在,由于方法pushViewController
,它仍然是一个推送,并且由于transition.type=kCATransitionFade代码>这将是一个淡入淡出的过渡。非常好
您可以选择更多过渡,如:
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
kCATransitionFade
我打算让我的加载屏幕成为一个带有一些照片的滑块,所以仅仅是一张图片是不行的
#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
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
kCATransitionFade