Two developers I follow on Twitter have asked pretty much the same question in recent memory: “Should I leave the status bar in iOS App Store screenshots or crop them out?” (link, link).
Crop out the status bar.
I replied to both on Twitter, but thought I’d write up a short post on it. A few people replied to the above tweets saying you should leave the status bar in the screenshots but take out the carrier. Someone even said they’d want to know what colour the status bar is for an app. Not sure customers would decide to buy an app based on the colour the the status bar to be honest.
The first screenshot you upload in iTunes Connect is used as the main screenshot. It is visible on your app product page on both the desktop App Store and the device App Store. For best results, do not include the iPhone or iPad status bar in your screenshots, and follow the requirements given below. Those dimensions allow you to remove the iOS status bar from screenshots so that you can showcase only the active app area, without distractions.
You can refer to Table 7-3 for screenshot dimensions for the various devices, both with and without the status bar.
But again: Crop out the status bar.
Use of status bar styles
On a related note, I strongly suggest going with a black status bar unless a status bar matching the colour of your navigation bar really enhances the UI.
The Keypad view in the Phone app shows a nice use of the default status bar where the top view seamlessly blends into the status bar. I also find that the status bar looks best when matched with the default navigation bar (blue). Other colours often don’t look right.
You can also mix and match throughout your app. The built in Clock app is a great example of this. The status bar compliments the navigation bar and background on the first two tabs, but the last two views are mainly black, so the status bar is black for these two tabs as well.
Earlier today I took some time to create a few more code snippets in Xcode for code I’ve been writing a lot of lately. I’ve never really seen or discussed these much with other developers, so I was wondering whether people actually use them – and to what extent? I know from my own experience that I don’t use them nearly enough, so I thought I’d write up a quick post on Xcode’s awesome Code Snippet Library.
The Code Snippet Library in Xcode is a great feature and a huge time saver – you’ll be doing yourself a favour by using it if you haven’t already! Ever noticed how when you start typing “init” Xcode will autosuggest the Objective-C init method? It does this because it’s a code snippet with a completion shortcut “init”. Same with “forin”, “dealloc” and many more built-in code snippets. Check each snippet’s completion shortcut in their edit mode.
Here’s a basic example of a “user” code snippet I have in my library:
I wrote up the code for a UIAlertView, highlighted the code and dragged it into the Code Snippet Library. The code snippet retains the parameter placeholders as well as your indentation (don’t worry about the indentation in the preview box such as in the example above, as long as it’s correct when used in your code). Now for the awesome part: Notice how I set the Completion Shortcut to “alertview” and the Completion Scope to “Code Expression”? Now, if I type alertview inside a method Xcode will auto-suggest this entire code snippet and I simple hit enter to use it and tab through the parameters to quickly setup a UIAlertView. Thanks Xcode <3
The Completion Scope is fairly important as it allows you to set the scope for when Xcode should auto-suggest your code snippet. If a code snippet is a method, set the scope as such and Xcode won’t auto-suggest that snippet if you’re inside a method. If you’re writing code for both OS X and iOS you can also set a specific platform for the code snippet so you’re not having your UIKit-specific code snippets suggested when you’re writing code for a Mac app.
Keeping your Code Snippet Library in sync
An hour ago, I tweeted about syncing Xcode Code Snippet Library with Xcode, which basically led me to writing up this blog post.
I’ve got my Macbook Pro at work and Mac Pro at home and often switch between the two. Unfortunately Xcode doesn’t have iCloud syncing – though what a nice feature this would be – so keeping your Code Snippet Library in sync could be a small pain. Enter symlinks.
Custom code snippets can be found in
Each code snippet is a plist file, which means adding or deleting code snippets on any machines won’t give you any issues (I believe it would in Xcode 3 because all snippets were saved into one file, which may have created some conflicts depending on the method used to sync).
Assuming you’re a Dropbox user*, you can use it to sync user Code Snippets between two or more machines. In the following example, I’ve setup a folder in Dropbox for Xcode. I’ll move my /CodeSnippet folder to the Xcode folder in Dropbox and setup a symlink in the original path that points to the CodeSnippet folder in my Dropbox:
You may have to sudo the last line, but now you should be all set. Do the same thing on your other machine(s) and start creating lots of useful snippets to use on any machine you’re working on! Don’t forget Completion Shortcuts to make your life much easier.
Hope you found this post useful. If you have similar tips, feel free to share in the comments. @tewhareplied to my tweet saying that he uses symlinks to sync Archived builds and other Xcode User Data across several machines.
*If you’re not a Dropbox user, feel free to use my referral link :)
Apple is known for its love of music and each year WWDC is filled with a great selection of music played before and after the Keynote, between sessions and during the Beer Bash. It’s a combination of old classics and new tunes, though I find that it’s not exactly Top 20 radio hits (which is a good thing!).
Each year I attend, I collect songs I hear using Shazam or SoundHound. Using SubEthaEdit I share a document and ask that other attendees help fill the playlist. In my experience, there seem to be a playlist of about 50 songs each year that are played throughout the week, some more than others. Since it’s impossible to be in every room, some songs may be missing from the playlist, but hopefully through collaboration, most are there. Feel free to let me know in a comment and I’ll add it to the playlist!
In previous years the band that plays at the Beer Bash gets a number of plays throughout the week, but this year I didn’t hear a single song from Neon Trees. Apple did announce the band early in the week and gave everyone a code to redeem two of the band’s hits through iTunes. While most people didn’t seem to have a clue who they were, I think a lot of people knew them from those two hits. I have included ‘Animal’ and ‘Everybody Talks’ in the playlist below (and on rdio).
Thank you to the following contributors (Name, Twitter, Email):
Rune Madsen @runmad firstname.lastname@example.org
Ola Rönnerup @fnolis email@example.com
David Wolf @davidwolf firstname.lastname@example.org
Grant Burry @grantburry email@example.com
Scott Andrus @scottandrus firstname.lastname@example.org
Charles Ying @charlietuna email@example.com
Mike Park @mikevpark
These were individuals who added their names to the SubEthaEdit document.
I went to one session where they played a track from Best of Bootie 2011 (listed as Titus Jones below). Since it’s a mashup, they may have played more than that one song. It’s a great CD regardless – and free – so worth downloading.
Here’s the playlist, sorted alphabetically (artist – song):
Beirut – Santa Fé
Beck – Gamma Ray
Bob Marley and The Wailers – Exodus
Brandon Flowers – Crossfire
Cake – Short Skirt/Long Jacket
Coldplay – Paradise
Coldplay – Talk
Edward Sharpe & The Magnetic Zeros – Man On Fire
Ellie Goulding – Lights
Fatboy Slim – The Rockafeller Skank (Mulder’s Urban Takeover Mix) / 2 PAC + Dr. Dre
Florence + The Machine – Shake It Out
Foster The People – Helena Beat
Foster The People – Houdini
Franz Ferdinand – No You Girls
Fun. (feat. Janelle Monae) – We Are Young
Gorillaz – Dirty Harry
Gotye (feat. Kimbra) – Somebody That I Used To Know
Here – Man on Fire
Imagine Dragons – It’s Time
Ini Kamoze – Here Comes the Hotstepper
Jack Johnson – From The Clouds
Jennifer Lopez feat. Pitbull – On The Floor
Julian Casablanca – 11th Dimension
K’naan – Wavin’ Flag
Kasabian – Fire
LCD Soundsystem – Someone Great
We Own The Sky – M83
Mat Kearney – Ships in the Night
Martin Solveig & Dragonette – Hello
Michael Franti & Spearhead – Hey Hey Hey
Neon Trees – Animal
Neon Trees – Everybody Talks
No Doubt – Underneath It All
OK GO – This Too Shall Pass
Owl City – Dreams Don’t Turn to Dust
Phoenix – Long Distance Call
Ra Ra Riot – Can You Tell
Regina Spektor – Don’t Leave Me (Ne Me Quitte Pas)
Rooney – When Did Your Heart Go Missing
Sara Bareilles – Uncharted
Snow Patrol – Take Back the City
The Black Keys – Gold On The Ceiling
The Black Keys – I Got Mine
The Flaming Lips – Yoshimi Battles the Pink Robots Part 1 [Japanese Version]
The Hit Crew – I Can See Clearly Now
The Killers – Read My Mind
The Police – Walking on the Moon
The Shins – Simple Song
The White Stripes – My Doorbell
Train – Drive By
Titus Jones – Hello Girl, Let’s Party Til The End (not on rdio, download link above)
TV on the Radio – You
Two Door Cinema Club – What You Know
Tycho – Hours
Vampire Weekend – Mansard Roof
Vampire Weekend – White Sky
Under the Influence of Giants – Mama’s Room
If you’re interested in last year’s playlist, you can find it here.
I’ve recently worked extensively with re-engineering and re-designing the UX and UI for an online retailer, which involved a lot of paper, Photoshop and CSS (or Sass).
I thought it would be cool to create the buttons from Mike Rundle’s article in pure CSS, so I went ahead and did it. Before checking out the CSS buttons, be sure to check out Mike Rundle’s examples and PSDs for a comparison.
I tried as much as possible to stick with the same colours and transparencies as Mike Rundle’s examples, although there may be slight differences, depending your display and browser.
I’ve also added :hover and :active states to all the buttons, so they’re a bit more exciting. Unfortunately CSS doesn’t provide a simple way to create a masked gradient at an angle, so the Convex example is probably the least similar one. But it still looks great and I wanted to stick with all CSS – could have been achieved with an image mask or simple overlay.
This is my last #idevblogaday post for now, and unfortunately I’ve completely run out of time for this week’s post and I can honestly say I don’t have any ideas for it either. How about that!?
Despite it now being a bi-weekly submission, it’s still hard to keep going with new ideas every two weeks :)
But I’d like to thank everyone who’s been reading my previous blog posts and please do check back again in the future. I’ll probably enlist myself in the queue again and try to write some blog posts in the meantime if I come up with some ideas :)
Accessibility on iOS provides visually impaired iOS users the ability to use an awesome touch screen platform to its full extent. It’s your job as an iOS developer to ensure your app works wonderfully with Accessibility on iOS.
When considering adding features or optimizing your app for Accessibility, don’t assume we’re just talking users who are completely blind. And despite being all iOS being full touch screen devices, there are lots of visually impaired users outthere, ranging from users who are blind, hard at seeing or colour blind, for example.
Apps, such as Mail, numerous Twitter clients and more include the possibility of changing text on the screen to a larger font size. Matt Rix‘ Trainyard includes an option for players who are colour blind. These are just a few examples of improving apps for Accessibility.
Also consider interaction. While a scroll requires just a flick with one finger for regular use, having VoiceOver enabled scrolling is done with a three finger swipe, and moves the UIScrollView (and any NSObjects that inherit from UIScrollView) a page at a time. So while a pull-to-refresh is awesome, for user with VoiceOver enabled, it might not be as apparent or ease to use.
In this post, I will focus a bit on optimizing your app for VoiceOver. Before continuing with this post, check the video below where a blind user shows off VoiceOver and demonstrates how to use it.
I also recommend enabling VoiceOver on your own device and playing around with it for a while, just to get familiar with it. One thing is to know about it and use it with the Accessibility debugger turned on in Simulator, another thing is to experience it for yourself!
While most of UIKit works fairly well out of the box with VoiceOver, there are plenty of things you can do to improve how your app works with VoiceOver. If you’re doing any custom UI (especially drawing) VoiceOver will most likely not work, or it may speak out the names of the object. So if you call a custom UIButton “createNewTaskButton,” that’s what it will say. Instead, it should probably say “Create New Task”.
Consider your own app(s) and what use visually impaired users may have of it. I made a transit app, so it was only natural to optimize it for visually impaired users and add custom and improved VoiceOver support. With VoiceOver enabled, users can tap the time until the next transit vehicle arrives and the device speaks out in plain English “Next TTC vehicles arrives in 5 minutes and 32 seconds. Tap again to hear updated time.” If I had not customized it, it would have just said “5:32.”
Underneath are subsequent vehicle arrival times. As you can see from the Simulator screenshot, without VoiceOver optimization, the device would just say “20 min bullet 25 min bullet 26 min.” With Voice Over optimization, it says “Subsequent TTC vehicles arrive in 15 minutes (pause) 20 minutes (pause) and 25 minutes. Tap again to hear updated times” Notice the (pause) and look at the screenshot. VoiceOver speaks pretty fast, so if you would like a bit of a pause, just insert a period, and it will pause a bit between the words. This is a great way to split up important information.
Also notice how it will say “and” for the last arrival time. If there are more or less times, it would only say it for the last item. Remember attention to detail in these cases. If someone was to tell you the information for what you touched on the screen, how would you best understand it? There’s a huge different between spoken language and UI. Keep this in mind!
For the buttons with which users can change a route, the label would look like this “506 • Carlton.” In this case, the literal VoiceOver sentence would be “506 bullet Carlton.” So I went ahead and customized this to “506 Carlton,” so it wouldn’t speak the “bullet” part of it. For the custom UIButton where the user can add or delete a route/stop selection to their Favourites, I added “This is a favourite. Double tap to remove from your favourites” and if the selection is not a favourite it would say “Not a favourite. Double tap to add to your favourites.”
If you’re doing any custom drawing, for example as I have done in the example on the right, you will need to pay extra attention to VoiceOver optimizations.
For flat, drawn views, VoiceOver cannot access any of the text or other information on screen. In this example, I draw each cell, so there are no UILabels or UIImageViews for VoiceOver to recognize and speak.
I therefore set the accessibilityLabel property on each cell which then provides VoiceOver with information about what to say. As you can see from the example, according to Accessibility Inspector, VoiceOver will say the route number and name, and because the item is a current selection, I also made sure VoiceOver lets the user know about this by saying “Current selection” after the route number and name.
For non-VoiceOver users, the checkmark is a great visual marker for the item being a current selection. But for VoiceOver users, this would have not been the case. Especially since it’s a custom drawn view, VoiceOver has no clue about the checkmark. In your Accessibility optimization, not only consider what VoiceOver would say, but also consider the UI and what VoiceOver can see, or should see that is related to the item the user it touching.The user may not know about a certain UI object or visual marker without VoiceOver telling them.
Accessibility Inspector in iOS Simulator is a great tool to help optimize your app for full VoiceOver support. Tapping the X button disables the Inspector and hides most of its UI. This enables you to see the app without VoiceOver enabled to quickly get to the content you’re currently debugging for VoiceOver, or since VoiceOver scrolling requires three fingers, it will allow you to scroll when you disable it temporarily.
While Accessibility Inspector shows what VoiceOver will say, you should again test on an actual device with VoiceOver enabled. As mentioned, one thing is how something looks and “sounds” when it’s written, another is how it sounds when VoiceOver speaks it.
So these were a few of the consideration I made for one of my apps in optimizing it for full VoiceOver support. For more on the subject, I urge you to read Apple’s Accessibility Programming Guide for iOS, which gives a more detailed overview of the possibilities as well as more in depth examples and usage guides.
Furthermore, Matt Gemmell has written a great post on it as well with more details on Accessibility properties, among other things, and it’s totally worth checking out.
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.