views:

422

answers:

2

Recently I've been looking to create some way of showing a user that something is being loaded. I'm sure anyone with an iPhone has seen this is apps before but what is the best way of doing it?

I started using UIProgressHUD, however it was pointed out to me that you shouldn't really use private (undocumented) API's.

I then I moved onto this which is a custom version called MBProgressHUD, however in my experience with this is wouldn't show the loading part when trying to call it not from a button and I found it very buggy (It wasn't very hard to crash the example code given by just clicking away).

I then went on to find this by James Brannan from his book, however I'm not quite sure why he claims this is the "proper way" of doing it when I've seen many apps in the past with what looks like the UIProgressHUD.

Does anyone have any ideas?

EDIT: This is pretty good...

Thanks

+2  A: 

There is no one "best" way. Another way to do this is to simply put a UIView atop your main view's subviews, mark its userInteraction property and grey it out when needed. You could even add a UIActivityIndicator as a subview of this "foreground" UIView, starting its animation when needed. When your loading has finished, hide/stop the activity indicator and clear the foreground view's color.

Alex Reynolds
+1  A: 

If you are talking about loading over a network, one good thing to start with is to enable the status bar network activity indicator:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Note that you have to set it to NO when you are done! That should only be used to indicate network activity.

That's a bit subtle though, it's a great idea to have some kind of progress indicator IF you can tell exactly how long something is going to take - downloads where you know the size and count incoming bytes, or uploads where you also monitor bytes outgoing and know the total size.

If your call length is very small or the size is not really known (web service call is a great example) then some kind of overlay with a UIActivityIndicator can be very relaxing (you can also make a custom variant with a set of images added to a UIImage view to animate). The key is, that if possible it should not block the user from doing other things if possible.

Also if you have multiple things going on, you might want to add messages describing what state you are in (like, "adjusting image", "uploading image", etc).

Kendall Helmstetter Gelner
It would be nice if all developers only used networkActivityIndicatorVisible in indicate network activity and not just any kind of activity or progress.
mahboudz
That's a very good point, I interpreted "loading" from the original post to mean "loading from network", but on re-reading I realize it could be loading some other kind of resource... I will edit my post to clarify.
Kendall Helmstetter Gelner
Thanks, it's not quite what I was after but I've found this very useful! I'm using this at the moment (http://cocoawithlove.com/2009/04/showing-message-over-iphone-keyboard.html) and the network activity indicator. My problem now is what to do if there is no network connection!
ing0