如何在iPhone应用程序中导航时实现加载动画?

6
似乎是一个非常简单的问题,但我一直找不到好的答案。
我想做的是在某些函数加载时制作某种动画。当等待内容时,我已经在Web应用程序中包含了一个动画GIF文件,但是在本地导航时需要相同的功能。例如,当我按选项卡栏中的按钮时,屏幕只是空白,直到整个页面加载完成。
它不需要任何花哨的东西。例如,我喜欢Facebook应用程序中的解决方案,其中包括臭名昭著的“旋转轮”。
提前感谢!
7个回答

26

你可以将UIActivityIndicatorView作为子视图添加到视图中,在动作结束后,你可以从其父视图中移除它...

UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
av.frame=CGRectMake(145, 160, 25, 25);
av.tag  = 1;
[yourView addSubview:av];
[av startAnimating];

移除它

UIActivityIndicatorView *tmpimg = (UIActivityIndicatorView *)[yourView viewWithTag:1];
[tmpimg removeFromSuperview];

希望这能有所帮助...


2
如果您想让指示器居中显示在当前视图中,您可以将代码的第二行更改为:av.frame = CGRectMake(round((yourView.frame.size.width - 25) / 2), round((yourView.frame.size.height - 25) / 2), 25, 25); - arlomedia
2
或者,为了居中... [av setCenter:yourView.center]; - Old McStopher

4

您的问题是活动指示器不会显示,因为它只会在下一次运行循环中显示 - 到那时,您已经完成了所有需要做的事情!

最简单的方法是将调用下一个视图的代码移到自己的方法中,然后(根据其他帖子中的建议构建UIActivityIndicator)执行以下操作:

[self.myactivityindicator startAnimating];
[self performSelector:@selector(myCodeToCallTheView) withObject:nil afterDelay:0];

这给了足够的时间来绘制指示器,然后运行您的代码来绘制视图。当然,一旦出现新视图,它就会覆盖选择器。


3

您可以将UIActivityIndicatorView添加到正在“加载”的任何视图中:

CGRect mainBounds = [[UIScreen mainScreen] bounds];
CGRect indicatorBounds = CGRectMake(mainBounds.size.width / 2 - 12,
    mainBounds.size.height / 2 - 12, 24, 24);
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]
    initWithFrame:indicatorBounds]];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[indicator startAnimating];
[yourLoadingView addSubview:indicator];

我成功添加了指示器,但不幸的是并不是在我应该添加的时候。我的目标是在从一个页面移动到另一个页面时(创建新的ViewController并使用NSURLRequest请求新页面时)使此指示器出现。我尝试测试webView.loading,然后在这个条件为真时开始动画,但什么也没有发生。屏幕仍然是白色的,直到加载新页面(是的,我已经尝试过使用背景颜色使其可见)... - Christer-André Larsen

3

啊哈!我刚刚偶然发现了一个非常方便的类:MBProgressHUD。试试看吧。我相信它能够满足你的需求,还有更多额外的功能。

我也在作者的博客文章评论中贡献了一些修改意见。


1
在美学上,注意到 UIActivityIndicatorView 自带几种内置样式供您选择。上面的代码示例使用了灰色和白色选项,但是苹果的文档中还有其他几种样式可供选择。您可以使用以下方式设置样式:
-initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyle)

或者通过设置对象的activityViewIndicatorStyle属性。


1

1

我猜这取决于正在加载什么?您在等待来自服务器的响应吗?在这种情况下,我通常会在我的视图上放置旋转轮(UIActivityIndicatorView),并勾选隐藏复选框(不进行动画时)。有一条消息可以通过编程方式设置此项。然后,当从服务器接收到数据时,我只需在UIActivityIndicator视图上调用stopAnimating,它就会隐藏。然后您可以显示任何需要显示的内容。


看起来正是我正在寻找的东西。你有这方面的一些示例代码吗?(我在Objective-C方面还有点生疏) - Christer-André Larsen
如果您在界面构建器中有一个视图控制器,只需将其子类化为自己的UIViewController子类。然后将IBOutlet UIActivityIndicatorView添加到视图中。假设IBOutlet UIActivityIndicatorView indicator; 然后您只需调用[indicator startAnimating]或[indicator stopAnimating];(我认为这是该消息的正确名称)。 - John
啊,抱歉,我没有说明,但我没有使用IB。应用程序几乎完成了,所以我宁愿不在这个时候开始使用它 :) - Christer-André Larsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接