Core Location presentation at TACOW

Last night, I did a presentation on Core Location for TACOW’s (Toronto Area Cocoa and WebObjects developers group) quarterly meet-up. I volunteered during a lunch with the group’s co-founders David (@rebeld) and Karl (@kolpanic) on the last day of WWDC.

I picked Core Location since I had learned some good insight at WWDC and also worked with the framework thoroughly through building my app Next TTC.

The presentation went well and was well-received, and I am now posting it here for everyone else to enjoy. I have left my notes in the presentation, but I am not sure how much help that will be. I suggest you view the presentation in Play mode, just so the animations help understand the content a bit better.

Download: Core Location Keynote presentation

Enjoy!

Social game marketing

I’m not a game developer and was actually not planning on doing a game-related post for #idevblogaday, but I’m currently reading Game-Based Marketing about how marketers can use game mechanics to create and foster long term customer loyalty. Basically think frequent flyer programs, points cards and any other type of loyalty program out there.

As a marketer, the premise of the book is quite interesting, and today almost any major chain will have some sort of loyalty program – even in smaller businesses you will find sorts of loyalty program through which you can earn points, loyalty and status amongst peers (much like achievements, leaderboards, etc. that you’ll find in games).

It got me thinking a bit about how game developers should try and utilize the same kind of systems that are in place for loyalty programs. For example, a big part of loyalty programs is earning points, achievements and essentially status within a certain program. People love showing off and they love earning points and higher statuses – even if it doesn’t really get them anything in return.

So in this week’s post I’ll discuss various ways game developers can implement different strategies that are found in loyalty marketing. I’ll discuss features that are well known and quite common in most top 25 App Store games, but at the same time, I hope to bring to light some aspects of these features.

Leaderboards
If you’re currently reading this and have a game in which you do not have a leaderboard, stop right now and start integrating one immediately.

A great part of the fun of playing games are being able to share with your friends your scores, points, etc. Also, being able to compare yourself directly with other players or friends playing the game is an important part of the fun.

The best way to do this is through an integrated leaderboard system. This allows the player to easily keep track of their score and abilities and compare them with their previous scores and how they rank amongst their friends and other players worldwide (or perhaps even cities, states, countries, etc.).

Game Center, OpenFeint, etc. provide easy-to-implement and solid foundations for leaderboards. These are also awesome (and free) marketing tools. For example, I have found myself looking through my GC friends games lists to find new games to play. It has also kept me coming back to certain games because GC has provided an opportunity to indirectly challenge me to continue playing the game to beat certain friends scores. This in return provides you as a game developer to cross-advertise your new game releases or sales for your other games.

Although competition is great, I wish more developers would integrate GC or OF (which also offer built-in GC integration), instead of trying to roll their own or using a less popular social game network. For example, when GC was released, I found myself revisiting old games to beat my friends’ scores or earn achievements. Those games that still do not offer a widely-used system just doesn’t draw enough attention, and I cannot be bothered to find out my friends’ usernames on the not-so-well-known social game networks.

Achievements
Achievements are also a great way to provide a leaderboard-type system in your game. It also helps prolong the experience and fun with your game.

A few examples of use of achievements in games:
• Achievements provide an opportunity to easily reward the player throughout the game. Levels, new upgrades, etc. This helps create a path for your game and a path for completion.
• Think of achievements that would require more practice or more time playing, basically ones that would prolong the game for players for after they’ve finished all levels. For example, Cut the Rope could use a timer and an achievement for finishing certain levels in certain amount of time, instead of just the three stars. You do earn more points for finishing a level fast, however this isn’t apparent, and after finishing the levels I cannot see how much faster I should have been in order to earn more points. Another example of achievements is Trainyard, which could give an achievement for finishing all stations in one city by using only X amount of tracks. These two examples provide a way to challenge the more hardcore players since they’re considerable more difficult than pure completion of a level, and it also does not hinder the completion of the game for the more casual players.
• Be careful not to make achievement nearly impossible to obtain. For example don’t make an achievement for “Played 100 hours” if your game basically takes an hour or two to finish all levels. Unless there’s a lot more to your game after having finished it, you can’t expect anyone to want to spend so much time playing it – even if they love going for those achievements.

Again, Game Center and OpenFeint provide great frameworks for integrating achievements as well as achievement leaderboards and friending systems. Use one or both of the solutions and think of ways to achievements into your game to make it more fun and challenging. They’re completely free and helps save you a ton of work instead of trying to roll your own.

Small side-note to leaderboards and achievements: Add a button somewhere in your games’ menus that let’s the user see their scores and/or achievements. Both GC and OF offer modal views for these. This way the user doesn’t have to leave the game to check an achievement or whether they’ve now trumped their friend’s top score, and you also help bring them right to the information they’re seeking – not leaving them to go to GC via the app itself, for example, and drill through the view hierarchy in order to find what they’re looking for.

Social Sharing
Sharing high scores, achievements, etc. is great opportunity to advertise your game and something that players love to do!

However, instead of just providing a Facebook and Twitter button for sharing a score or achievement, why not go a littler further and help the player out with deciding when it’s appropriate to do so? For example, what might seem like a low score to one player, may turn out to be in the top 5% of the leaderboards. After completion of a level or game, the developer could integrate a system that looks up the score and based on various factors it may say something like “Holy shit, your score was super high, you’ve just entered the top 10%, you should totally brag about it on Twitter and/or Facebook!” – or something like that. This helps the player realize the worth of their skill and score and may actually be more effective than just having a button that enables sharing of a score on social networks.

Also, don’t just tweet a score plus a link. Players will look through this as a pathetic attempt from you to get some free advertising out of them. They already paid you money, why should they help you out more, even your game is the most awesome one ever made?

I realize you don’t have a lot of characters to work with on Twitter, but including more than just the score is important. If I see “John just scored 13,453 in [some game]!”, I don’t really know whether it’s a good score and it doesn’t provide me with a way of relating this score to my own skills (unless I have played it). However, if I see something like “John just placed in the top 5% in [some game] with 13,453 points!” I would be more interested and perhaps more inclined to try out the game and beat John’s score if I know we have similar skill and scores in most games. It also gives both John and his friends a better understanding of just how awesome getting 13,453 points is. Without relating the points to anything, no one can see whether it’s actually a good score if they don’t know the premise of the game and the value of those points. John might actually be tweeting a super low score (compared to his friends’ scores), so helping John decide when it’s an appropriate time to share his score helps him save the embarrassment of tweeting a humiliatingly low score.

Basically, adding more substance to your sharing feature gives you more respect from your user (surprise and delight) and also makes them more likely to actually indirectly want to help you advertise (which you have to admit; you’re adding this feature more for yourself to advertise than actually just scoring some random score).

Another great way of sharing content from your game is something like Matt Rix‘s Trainyard solution sharing system. It works both as a way for players to show off their skills, but also helps more casual players progress through the game. Hardcore players love showing off and it also provides a way to prolong the game for hardcore players as they may try and find new solutions that haven’t yet been done. Linking this with the previous paragraph, one thing the game could do was to provide a small notification if a solution is 100% unique by saying “You have created a unique solution not yet available on Trainyard.ca, would you like to share with the community?” This helps the player realize their skill compared to others and again provides the more hardcore gamers with replay value, as they may go back to some levels in order to make new solutions, not yet seen by the community. That in itself could create a separate leaderboard for players which shows the top 50 players who have come up with and shared unique solutions, again improving the experience and loyalty further for those committed to the game and the community that surrounds it.

Game save syncing
This is as much of an idea as it is a request to all game developers out there.

Universal games are starting to become more common, now with iPhones, iPods touches and of course iPads selling like crazy. I own both an iPhone and an iPad and love when developers take a bit of extra time to release their game as a Universal game – even if the iPad is pretty much the same as the iPhone game, just larger. Of course, not all games scale as easily from iPhone to iPad in terms of the experience with the extra space, but for games that I play both on my iPhone and iPad, I would love to see server-based game save syncing or whatever you want to call it. However, this doesn’t just go for Universal apps, since many people have several devices. If they have the same game installed on both their iPhone and iPod, why not make the game experience more fluid?

The premise of this idea is dead simple: I play a game on my iPhone on the subway home from work. When I get home and hit the couch later that night, I want to reach for my iPad on the coffee table and play the exact same game, from the exact point I left off. I don’t want to start over from level one. I don’t want to have to earn the exact same achievements I just unlocked four hours ago (especially since they’ll appear as unlocked just fine if I head into Game Center).

Again it might be something 80% of users wouldn’t need. You may never have had to bring your game saves on your Wii controller to your friend’s place or transfer your PS3 game saves to your buddies PS3 so you can show of your collection of sweet cars in GT5. But it’s something we have now seen in console games for well over a decade now. As much as it may be a less used feature, it’s something I just don’t understand why is missing on such a portable platform.

It could be somewhat simple, depending on what your game exists of. When you start adding stuff like specific amounts of bullet ammo left, percentage of health left, points in each cleared level, etc. we’re getting a bit more advanced, but it’s definitely possible, regardless.

Game saves could be saved on a server and retrieved using an email and password. I don’t know the exact workings of GameKit, but maybe a successful login to Game Center could prompt a “It appears you have a game save available in the cloud based on your GC username, would you like to sync this device and keep your progression in sync?”. (If anyone at Apple is reading this or if you know someone working on GameKit, please let them know to consider adding game save-syncing to Game Center :))

Or even something like bluetooth sharing of game save states, bumping devices, or sharing via a unique code displayed on one device and entering the code on the other device would retrieve whatever was just uploaded to the server.

Just a few ideas of how you may be able to work it out, but seriously, this is such a great feature that would really set your game apart from others (apart from being a unique experience in itself, of course) and your users will love it.

I have yet to come across a single iOS game that does this, so if you know of one, please do share it in the comments, so other developers can check out and perhaps get some ideas for their own game.

Wrapping up
I hope I have sparked some ideas into your head as to what you can do to enhance the experience with your game and creating some loyalty amongst your customers. Some of the above ideas definitely will enhance and prolong the game experience, adding value to your game from what is actually very little work in most cases, implementing GC or OF or enhancing score-sharing on social networks.

Thanks for reading and please do leave a comment!

Quick guide to updating your app’s UI for iPhone 4

iPhone 4 will make your UI look stunning. Everything in UIKit has been scaled up already so it will require only a bit of work on your end to make the rest of your app look amazing on iPhone 4. If you only code and don’t touch Photoshop, you’re in luck. However, if you’re a UI designer or have the skills to do your own UI, hopefully you did your original artwork in a nice high resolution – if not, you have a bit of work cut out for you with updating all the UI elements to 2x the resolution.

Updating your app’s UI to be compatible with iPhone 4’s Retina Display is amazingly simple. Since the scale works in points, not pixels, you will have to do very little work on the layout itself. Apple Engineers have made it really simple to use new graphics for all your UI on iPhone 4, at the same time as being compatible (and not using 2x memory) on older, lower resolution, lower memory devices.

All you have to do is add the same image file at 2x the pixels to your app’s resources and name it the same it’s lower resolutions sibling with the following suffix: “@2x”.

For example, in your Resources folder, you will now need to have two image files, one for older devices called myImage.png and one for iPhone 4 called myImage@2x.png, which is twice the resolution.

This way, when you call [UIImage imageNamed:@”myImage.png”]; (or contentsOfFile:) iPhone 4 will automatically grab the filename with a @2x suffix, and lower resolution images will grab the lower resolution copy. You don’t have to check for the device loading the image and write any additional code to grab the correct image. Genius!

If you have seen an iPhone app on the iPad in 2x scale, that’s pretty much how your app is going to look on the iPhone 4. Perhaps not so drastic, but there will be a noticeable difference from app not optimized for iPhone 4 and “Retina Apps” as Apple calls them.

Thoughts on @2x on iPad…
I didn’t hear anything at WWDC regarding this, but my thought is that they’ll integrate this into the iPad for the next major OS release. Basically, it will be able to do the same and grab the higher resolution image appropriately for iPhone apps running at 2x scale.

Happy Photoshopping to UI designers and happy relaxing programmers!

UPDATE JULY 7, 2010:

I have discovered a bug in Apple’s code that deals with grabbing the correct image on iPhone 4. If you are using imageWithContentsOfFile: the code will in fact not automatically grab the @2x if running on iPhone 4. I have submitted a bug report to Apple, and they’ve informed me they are now aware of the issue and the Engineers are currently working to fix the bug. So for now, stick with imageNamed: for all your images.

Debugging Executables for Push Notifications

I am implementing Push Notifications in one of my apps. Doing so may be a bit tricky in terms of debugging since you cannot actually debug incoming Push Notifications appropriately while the app is running, so I wanted to share this tip. Also, I am writing this post on my iPad on an airplane, so pretty excited about that :)

Xcode allows you to debug applications that are running locally on your device. You can even set breakpoints in your code and print out any information you may need from the console in order to debug your app and fix whatever issue you’re experiencing, should you not be able to fix it via “live” debugging.

This feature is especially useful if you’re doing Push Notifications (a great way to easily communicate information to your user with their permission, such as notifications, reminders, marketing (be careful with this one), etc.).

With Push Notifications, your app receives data from Apple Push Notification servers in a dictionary in the UIApplication delegate application:didFinishLaunchingWithOptions: that you’ll need to parse and do in your app whatever is appropriate for the implementation you’ve chosen (launching with specific views in front, etc.). Since your app cannot be running while receiving Push Notifications (it actually does receive notifications while running, but you’re required to deal with that through another delegate method), you’ll need to use the “debug executables” with “Wait for next launch/push notifications” ticked. Once you run the debugger and launch your app (for example directly via a Push Notifications UIAlertView) you can set breakpoints anywhere in your code and use the console to print out (po) any objects you may wish to inspect.

As your app launches immediately when you debug, it’s a problem if you’re debugging Push Notification (which, by the way, does not work in Simulator). So here’s the hidden treasure in Xcode: In the Groups & Folder pane, find Executables, expand and select your app executable. Hit command+option+i to “Get Info” and select the Debugging tab. From here, tick “Wait for next launch/push notification”.

Now, when you Run & Debug your app it will not launch, but instead wait until you tap the app icon to launch it or the app is launched via a Push Notification UIAlertView (this of course requires you have not set the “action-loc-key” to null in your Push Notification JSON dictionary).

Once your app launches via a Push Notification, it will stop at the breakpoint you set and you can now print out any information you need to debug your app, such as the NSDictionary your app receives, whether the appropriate view will be displayed and any other issue you may have.

Some notes on UIView animation

UIView animation is a simple and nice way to add to your user experience. I just wanted to point out a few suggestions when using UIView animations.

Duration (speed):
If you choose to use animation to compliment some of the stuff already happening in UIKit, either at the same time or before/after, it makes a big difference how fast your animations are. Pretty much all the UIKit animations I have come across have a duration of 0.3f and so should yours. Of course, it’s doesn’t always work 100% but for the most part, 0.3f is what you should aim for. It’s quick so your user don’t wait for something to finish animating before continuing with the next input action, and it’s not too fast so that the user doesn’t have a chance to see where the object came from or what happened.

If you have an animation happening while the keyboard animates up or down, use an animationDuration of 0.3f. Same with pushing and popping the navigationController. Annotations in MKMapView also drop at a duration of 0.3f.

0.3f is the way to go.

A simple UIView animation can be added with the following code:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
self.segmentControl.alpha = 1.0f;
[UIView commitAnimations];

The above example is from an app I’m doing, where the segmentControl is enabled and I increase its visibility in the toolBar at the same rate as a pin drops in the map within the same screen.

When to use animation:
A few objects come with free animation (also at a duration of 0.3f, of course). For example, when adding a UIBarButton to your UINavigationBar, consider setting these with animation. If you replace a UIBarButton with another, they’ll even animate in and out nicely during the change. When adding a pin to a map, why not drop it onto the map with an animation, instead of it suddenly appearing on a map from nowhere?

Another good advice is to do animation (whether your own or with objects that include animations) to bring attention to an object. For example, if you have a pushed view, consider what you can “add” after the view has appeared through animating your objects in viewDidAppear.

Create a better UX with animation
Consider all the ways you can use UIView animation blocks in your app to enhance the user experience. It’s a great way to create a more fluid and pleasant experience for your users. A user’s inputs and actions will feel less rough and more smooth and soft to the touch. Don’t go overboard with animations. Too many will become annoying and it’s important to use animations only where appropriate.

The best advice is probably to have a look at many of the built in apps designed by Apple as well as the many free animations that a part of UIKit objects (how UIBarButtons animate in and out when you push a UIViewController stack, how a modal view appears from the bottom, etc.).

Why the whole world can’t have iPad now

I was chatting with a friend today regarding the possible release of iPhone HD on the day of this year’s WWDC June 7th keynote. This lead us to talk about previous year’s release dates and whether the iPhone HD will be available worldwide on the same day (or at least not a US-only release).

We all know the first iPhone was released a full year before becoming available anywhere else and that recently, the iPad was released in the US prior to becoming available in other countries, including Canada. The iPad’s international premiere was even pushed back another month due to the incredibly high sales in the US.

You may already know the reasoning behind the spread in release dates or perhaps you never thought of it, but just felt annoyed by not being able to buy awesome product at the same time as the Americans. Here are my three thoughts on why iPhone and iPad have been released with spread-out released dates.

1. Test the waters
The first iPhone was a huge step for Apple. Last time they released a similar product it flopped. Diving face first into a packed market place with so much competition and going head-to-head with companies such as RIM, Motorola and Nokia was a huge step. You can argue that Apple was more fit this time around, but it’s still a big step, even for a company like Apple. It’s simply too risky to go ahead and release a new product in an entirely new product category (one can argue that Apple extended the mobile computing category and/or mobile phone category with the iPhone) without knowing how the product will be received in reality (one thing is hype (read: geeks) another thing is public reception).

Obviously the iPhone was a huge success and there was a big demand from international markets as well. Following the first iPhone, new models have generally been released more or less at the same time.

Remember the first PlayStation? Yeah, same thing… It was an entirely (though less saturated) market for Sony, which meant a late ’94 release in Japan and late ’95 release for the rest of the world. With the PlayStation 2 and PlayStation 3, release dates have been considerably less time apart (6 months and 6 days, respectively) from Japan to US/Europe.

iPad is perhaps not an entirely product for Apple (Mac + iPhone = iPad), but the spread out release dates still gives Apple a chance to test the waters and adjust their strategy for the worldwide market as needed.

2. Supply and demand
Why was the iPad delayed internationally? Well, Apple actually said so themselves. The US demand has simply been too high to keep up with production. Nintendo saw the same issue with the Wii being sold out consistently for years (however, it was simply getting ridiculous after two years. That should be enough time to sort out the manufacturing bottleneck).

From previous experiences, Apple was wise enough to contain the release to one market first and once they can keep up with demand in that market, open up for more markets, doubling the possible demand for iPads. Some people would argue that it’s great for buzz and hype if there’s so much demand for your product you can’t keep up with production. This was maybe true for Nintendo (I can’t imagine how stressful some parents must have been, trying to find their kids a Wii for Christmas), but Apple has a pretty clean history of being able to keep up with demand. Both the iPhone and iPad have been easily available since launch. Sure, there have been a few times and a few places where it has been hard to obtain one, but generally, anyone, not only hardcore release-day-campers or those who pre-order a month in advance, have been able to get their hands on an iPhone or iPad. The iPad has already found it’s way into the hands of a diverse group of consumers – not only the early adapters.

3. Manufacturing strength
With any new product comes new manufacturing methods and requirements. This was true for the iPhone and is true for the iPad as well. Over the years, Apple has expanded it’s manufacturing facilities and collection of suppliers to accommodate high sales volumes.

I can’t imagine the cost of setting up a new facility to output an unproven piece of hardware and at the same time making sure enough products are initially manufactured to keep up with an expected high demand. Just the fact that they’ve been able to produce enough iPads to sell 1 million iPads in 28 days is incredible considering they’re also starting production on iPads for other markets.

The next iPad will probably be released in all the markets where the current iPad is already available (at that time), because Apple will simply have been able to ramp up their manufacturing to accommodate the demand.

That’s my take on why the whole world can’t have iPad at the same time as the US. Feel free to add anything in the comments below :)

UITabBarController and UIActionSheet – 65% less hit point!

Ever noticed an app where the UIActionSheet’s bottom button doesn’t want to respond to your taps, unless you hit exactly in the top of the button? If you have a UITabBarController and want to display a UIActionSheet, you have to be careful with what view you show the UIActionSheet in.

If a UIActionSheet is shown in “self” or “self.view” and you got a UITabBarController behind it less than half of the last button will respond to taps:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"UIActionSheet Title" delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Option 1", @"Option 2", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
[actionSheet showInView:self];
[actionSheet release];

Here’s how much of the button will actually respond to taps:

Here’s what you need to do to fix it:

[actionSheet showInView:[[[UIApplication sharedApplication] windows] objectAtIndex:0]];

And what it does:

Linking *directly* into your app’s reviews in the App Store [UPDATED]

UPDATED 10/3:

I have received some feedback regarding this post that I thought I would share:

One developer implemented this feature in a UIAlertView pop-up, asking users nicely if they’re enjoying the app and whether they would like to be taken to the App Store to review the app. This UIAlertView happens after the 10th app launch, so you’re already dealing with people who have used your app enough that they must be liking it. It’s a $0.99 app by the way.

In just two short hours after implementing this, he had received 6 new app store reviews, all with positive feedback along with 4 or 5 stars, nothing less!

What can we learn from this?

1. People are, by nature, lazy. Consider the steps required to actually reviews an app that you like: You have to actively find it again in the App Store, scroll down and go to the review page. Then tap the button to submit your own review, login, etc. Unless someone’s super excited or very pissed off about your app, you will only see a small percentage of people taking their time to go through all those steps to review and rate your app. By asking users, who’ve been using your app more than just a few times nicely for a review, then linking *directly* to the App Store, they’re already skipping many of the above steps and rating and reviewing your app becomes a quick activity related to an app they’re enjoying.

2. Reviews are generally positive. Ratings on the other hand tend to be more black and white. Either people hate your app, delete it and quickly give it 1 star. I doubt a lot of people give apps 4-5 stars when they delete an app. They’re deleting it for a reason; either they didn’t like it, or it just wasn’t what they needed/expected. If they like the app, chances are they’d never delete it, and you wouldn’t be getting those great 4-5 star ratings (refer to #1). I have seen reviews that have pointed out several wrongs about apps, but they’re still adding a 4-5 star rating with the review. It may seem there’s a difference in people’s mind about a review and a rating. I think a lot of users think of reviews as a way of communicating to the developer that there’s an issue with the app, or they want this or that added, but they still use and love the app regardless (giving it a high rating).

3. You’re asking the right users. When deleting an app, Apple has implemented a horrible UIAlertView asking the same people who just got rid of your app to rate it. I think we all agree this is ridiculous (refer to #2). With a UIAlertView inside your app for 10+ launches linking into the reviews of your app in the App Store, you can pretty much assume these people are enjoying the app, especially if they agree to review it. If they’re don’t like it that much or don’t have time, it’s just a simple tap to dismiss the UIAlertView.

ORIGINAL:

Today @coffeeandiphone we briefly discussed ratings/reviews for apps, and one person mentioned he’d like to show some of the users who have used his app more than X amount of times an alert where he’d ask them to review his app in the app store.

So here’s a link that will take people directly to the review section of your app in the App Store. Note, though, they won’t be able to go “Back” to the actual page for your app in the App Store (when on a device), so they can’t really see that they’re on the review page for your app. Therefore, you probably want to make it veryclear where your linking to and before sending them out of your app, into the App Store.

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=341136260&pageNumber=0&sortOrdering=1&type=Purple+Software&mt=8

See where is says “?id=341136260” ? That’s the only thing you need to change. Just insert your own app ID there and you’re good to go. Don’t get confused by “type=Purple+Software&mt=8”, because if you change that, it won’t work for some reason. I am not quite sure why it has to say Purple Software, but I don’t really care as long as it works :)

Combine it with something like this (“Fighting Back Against The App Store’s Negative Rating Bias”) and you’re good to go!

Edit: I can’t remember where I got this info from, but credit goes to whoever/wherever, of course.

Colouring fun with moreNavigationController

When adding more than 5 view controllers to your UITabBarController, a “More” tab is automatically setup for you, which includes a view controller and even a modal view for letting the user edit the app’s tabs in the order they want.

By default, the navigation bars for both the moreNavigationController and the modal view (edit) are the Default blue, but changing these colours isn’t exactly straightforward.

Here’s an example of what we want to achieve:

I use an orange colour in one of my apps for the navigation bars and it just looks wrong when the more tab’s navigation bars are blue.

Changing the colour of the moreNavigationController is quite easy. After you alloc the UITabBarController, set the colour of the moreNavigationController:

tabBarController.moreNavigationController.navigationBar.tintColor = [UIColor orangeColor];

You can also use the barStyle property if you like:

tabBarController.moreNavigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

That wasn’t so hard. But the navigation bar for the modal view that pops up when the user taps “Edit” is still the default blue. So let’s change that as well:

First, if you haven’t already, make sure your AppDelegate implements the UITabBarControllerDelegate. Then add the optional delegate method willBeginCustomizingViewControllers: in your AppDelegate’s implementation file, and add the following lines of code:

– (void)tabBarController:(UITabBarController *)controller willBeginCustomizingViewControllers:(NSArray *)viewControllers {
    UIView *editView = [controller.view.subviews objectAtIndex:1];
    UINavigationBar *modalNavBar = [editView.subviews objectAtIndex:0];
    modalNavBar.tintColor = [UIColor orangeColor];
}

Again, it’s possible to set the barStyle property instead of the tintColor, but barStyle won’t give you all the colour options, of course.

Now that you have gained control of the modal view, you change more properties. By default, the navigation bar title says “Configure”, but you can change that as well, or how about the background colour? Here’s how:

– (void)tabBarController:(UITabBarController *)controller willBeginCustomizingViewControllers:(NSArray *)viewControllers {
    UIView *editView = [controller.view.subviews objectAtIndex:1];
    editView.backgroundColor = [UIColor grayColor];
    UINavigationBar *modalNavBar = [editView.subviews objectAtIndex:0];
    modalNavBar.tintColor = [UIColor orangeColor];
    modalNavBar.topItem.title = @"Edit Tabs";
}

Regarding the HIG… I am not sure if all this is allowed. I will be submitting an update with an orange coloured navigation bar for both those views, and I believe other apps have it (NY Times) so I don’t think it goes against the HIG.

However, I don’t think it’s a good idea to change the backgroundColor property of the “editView”. I tried with a grey colour and it doesn’t look right. It might also get your app rejected, because it’s such a big change. That your navigation bars are the same colour throughout your app only makes it look better in my opinion, rather than having a blue navigation bar clash with the rest of your beautifully designed app :)

Dedicated Static Analyzer Debug Configuration in Xcode

I went to iPhone Tech Talk in Toronto yesterday, and among the many sessions, I attended Michael Jurewitz’ (@jurewitz) session, “Testing and Debugging Your iPhone Application.” He covered a lot of the basics for using Instruments (very similar to last year’s session on that), how to setup provisioning, etc. for Ad-Hoc Beta testing, etc.

He also covered Xcode’s new built in Static Analyzer (Clang), which is incredibly useful and powerful now that it’s a part of Xcode. However, I haven’t been using it that much (he said to use it at least once a week), but he briefly showed that there’s actually a setting in the project’s build settings called “Run Static Analyzer,” which is a checkbox and checking this will run the Static Analyzer every time you build your project. Jurewitz mentioned you could make a duplicate Debug build configuration that is dedicated to running the Static Analyzer.

He went over this very fast, so I think a lot of people missed the benefit of this great tip!

So here’s how you do it:

Open your project settings and go to the Configurations pane. Pick your Debug configuration (or whichever build configuration you want to dedicate to running the Static Analyzer) and hit Duplicate in the bottom of the window. I called mine “Debug with Clang,” so I know it’s my Debug build configuration.

Next, hop into the Build pane and find “Build Options”. Within those options you’ll find the “Run Static Analyzer” option. Check the checkbox and you’re good to go!

Now, every time you build your project using your new “Debug with Clang” it’ll automatically analyze your project. Personally it’ll probably help me remember to run the Static Analyzer way more often on my project, instead of just once in a while.

Keep in mind that running the Static Analyzer increases the time it takes to build your project, so don’t choose that build setting if you’re just testing new code, etc. Also, I find it’s a good idea to “Clean All Targets” once in while, as it seems to ‘reset’ the Static Analyzer, because otherwise I am finding that it tends to miss certain errors on the second, third, fourth, etc. time you build with the “Run Static Analyzer” option on.