{"id":2993,"date":"2012-05-11T16:46:22","date_gmt":"2012-05-11T23:46:22","guid":{"rendered":"http:\/\/www.podfeet.com\/wordpress\/?page_id=2993"},"modified":"2014-05-19T21:55:00","modified_gmt":"2014-05-20T04:55:00","slug":"build-accessible-ios-apps","status":"publish","type":"page","link":"https:\/\/www.podfeet.com\/blog\/tutorials-5\/build-accessible-ios-apps\/","title":{"rendered":"How to Build Accessible iOS Apps"},"content":{"rendered":"<p>These notes were created by Donald Burr of Otaku No Podcast from <a href=\"http:\/\/otakunopodcast.com\" target=\"_blank\">otakunopodcast.com<\/a>.  Donald was the guest on <a href=\"https:\/\/www.podfeet.com\/wordpress\/2012\/04\/364-ios-tips-nomenubar-akinator-snapguide-iluv-inline-remote-cablejive-dockstubz-songza-coding-accessible-ios-apps\/\" target=\"_blank\">episode #364<\/a> of the podcast.  If you&#8217;d like to listen to the audio as you read along, click the link below:<\/p>\n<blockquote><p><a href=\"https:\/\/podfeet.com\/misc\/accessible_app_dev_donald.mp3\" target=\"_blank\">Donald Burr on Accessible App Development<\/a><\/p><\/blockquote>\n<h3>How to Build Accessible iOS Apps by Donald Burr<\/h3>\n<p>When the iPhone first came out, people assumed that the blind wouldn&#8217;t be able to use it because it&#8217;s a touchscreen device with only 4 buttons. Apple proved them wrong. They have embraced accessibility in a BIG way. The iOS platform is the industry leader in mobile accessibility. Android, Windows Mobile, Blackberry, etc. don&#8217;t even come close. That&#8217;s why I&#8217;m a Mac\/iOS user &#8211; my vision has fortunately remained stable, but I am always afraid that things might take a turn for the worse&#8230; but if they do I am ready for it<\/p>\n<p><strong>When talking accessibility, what are we talking about?<\/strong><\/p>\n<p>Primarily will be talking about accessibility for the visually impaired, because that&#8217;s the one that requires the most effort from developers. There are some considerations for other disabilities which I will briefly touch on later.<\/p>\n<p>Basically each thingie on screen (button, text field, label, icon, etc.) has certain attributes that the Accessbility API&#8217;s need:<\/p>\n<ul>\n<li>Is it an accessibility element? (Should VoiceOver be able to &#8220;see&#8221; it and recognize its existence?) (<strong><span style=\"font-family: 'Courier New';\">isAccessibilityElement<\/span><\/strong>)<\/li>\n<li>What is it? (<strong><span style=\"font-family: 'Courier New';\">accessibilityLabel<\/span><\/strong>and <strong><span style=\"font-family: 'Courier New';\">accessibilityHint<\/span><\/strong>)<\/li>\n<li>What are its traits? (<strong><span style=\"font-family: 'Courier New';\">accessibilityTraits<\/span><\/strong>)<\/li>\n<\/ul>\n<ul>\n<li>Type of item (static text, button, image, adjustable control, etc.)<\/li>\n<li>Is it clickable (can you interact with it)?<\/li>\n<li>If it&#8217;s a selectable object, is it currently selected?<\/li>\n<li>Does clicking on it start some sort of media playback (audio\/video)?<\/li>\n<\/ul>\n<li>If it&#8217;s an adjustable control, what is its current value? (<strong><span style=\"font-family: 'Courier New';\">accessibilityValue<\/span><\/strong>)<\/li>\n<li>What are its on-screen coordinates? How big is it? (<strong><span style=\"font-family: 'Courier New';\">accessibilityFrame<\/span><\/strong>)<\/li>\n<p>Here&#8217;s the good news: Apple makes it really easy to make your apps accessible. They provide a very rich set of tools and APIs that help with this. Which means you have absolutely positively NO excuse not to! In most cases, all it invokes is literally just a few extra lines of code, and poof, instant accessibility. In some cases, no coding is required at all.<\/p>\n<p><strong>Standard UI elements:<\/strong><\/p>\n<ul>\n<li>One of the great things about developing for iOS is Interface Builder &#8211; you can piece together your program&#8217;s UI by dragging and dropping from a large palette of UI widgets (text labels, buttons, sliders, etc.)<\/li>\n<li>If you use these standard interface elements &#8211; guess what &#8211; the system automatically makes them accessible. Since Interface Builder knows what it is you&#8217;re putting on screen, it automatically fills in the necessary accessibility information.<\/li>\n<li>Works best if your UI has obviously titled elements (i.e. a button titled &#8220;Play&#8221; that starts playing something).<\/li>\n<li>Beware ambiguous labels (or controls that don&#8217;t have a label)!<\/li>\n<\/ul>\n<ul>\n<li>Example: In the Otaku no Podcast app, in the Podcasts screen (first tab), there are entries for &#8220;Latest Audio Podcast&#8221; and &#8220;Latest Video Podcast.&#8221; Beside each is a &#8220;Play&#8221; button. It&#8217;s obvious to a sighted user what each Play button does; however, for a VoiceOver user, all they would hear if they tapped it is &#8220;Play&#8221; &#8212; play <em>what<\/em>??!<\/li>\n<li>Example 2: In the Otaku no Podcast app, look at the Audio Player screen. The &#8220;play button&#8221; at the lower left uses the &#8220;play&#8221; graphic &#8211; no text label. In this case, since VoiceOver doesn&#8217;t have a text label to fall back on, it uses the filename of the image that the button is using. So you&#8217;ll hear something like &#8220;playbtn dot PNG&#8221; which is even worse!<\/li>\n<li>In cases like this, we need to give iOS some more specific information.<\/li>\n<li>In Xcode, highlight your UI element, then go to the Identity Inspector. There you will find a section on &#8220;Accessibility.&#8221;<\/li>\n<li>&#8220;Enabled&#8221; &#8211; whether this item should respond to VoiceOver (You&#8217;ll almost always want this)<\/li>\n<li>&#8220;Label&#8221; &#8211; What you want it to say (Example: for the &#8220;Audio Podcast -&gt; Play&#8221; button I put &#8220;Play the latest audio podcast&#8221;; for the &#8220;play graphic&#8221; button I put &#8220;Play&#8221;)<\/li>\n<li>&#8220;Hint&#8221; &#8211; This text is spoken after a short delay after the &#8220;label&#8221; is spoken. Useful to give the user additional information about this particular UI element. (Example: for the Refresh button, the button&#8217;s Label is &#8220;Refresh&#8221;, and its Hint is &#8220;Tap to check for new episodes&#8230;&#8221; &#8211; it gives the user some additional information if he\/she is confused.)<\/li>\n<li>&#8220;Traits&#8221; &#8211; Most of these options are very specialized, and you don&#8217;t want to go turning them on willy-nilly. Here are the important ones:<\/li>\n<\/ul>\n<ul>\n<li>&#8220;Button&#8221; &#8211; is this a button?<\/li>\n<li>&#8220;User interaction enabled&#8221; &#8211; can you &#8220;do&#8221; something with it? (I.e. tap a button, enter text into a text field, etc.)<\/li>\n<\/ul>\n<li>You can still manipulate these values in code if you want (handy if e.g. you need to change your UI to respond to conditions when your app is running).<\/li>\n<li>Some actual examples from the Otaku no Podcast app: <a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<br \/><\/a>Look at &#8220;OnP main screen &#8211; play latest button,&#8221; &#8220;OnP main screen &#8211; refresh button,&#8221; and &#8220;OnP player screen &#8211; graphical play button&#8221;<\/li>\n<p><strong>Custom UI elements<\/strong><\/p>\n<ul>\n<li>Sometimes the standard controls aren&#8217;t enough (you need more\/different functionality); also sometimes you may use standard controls, but want to create and manipulate them in code (rather than using Interface Builder). In these cases, you will need to use code to set up all the necessary accessibility information.<\/li>\n<li>All accessibility information can be set in code.<\/li>\n<li>Example:<a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<br \/><\/a>Look at &#8220;adding to code 1&#8221; and &#8220;adding to code 2&#8221;<\/li>\n<\/ul>\n<p><strong>Accessibility Containers<\/strong><\/p>\n<ul>\n<li>Sometimes you may have an object that is subdivided into multiple sub-objects. You need to provide accessibility information for those sub-objects.<\/li>\n<li>Example: the Convention Calendar tab in the Otaku no Podcast app. The entire calendar view is a single object; each individual day is a sub-object. Unfortunately this is one area where I still need work; it is completely inaccessible. I&#8217;m using an open source calendar library that isn&#8217;t yet accessible. I&#8217;m working with the developer to add accessibility to it. For an example of this done right, take a look at the iPhone&#8217;s Calendar app, in Month view.<\/li>\n<li>In this case, we use a series of &#8220;accessibility containers.&#8221;<\/li>\n<li>Each container provides a full set of accessibility information to the OS (description\/label, value, hint, etc.), as well as the bounds (the physical location\/dimensions of the area where this accessibility information is attached to).<\/li>\n<li>These elements are stored in an array (an ordered collection of objects). You need to provide three pieces of information to the Accessibility API&#8217;s: the number of items in this array, a way of retrieving a given item #, and a way of testing if a given item is part of the array. (In 99% of the cases, these will be trivial one-liners.)<\/li>\n<li>Example:<a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<br \/><\/a>Look at &#8220;container code 1&#8221; and &#8220;container code 2&#8221;<br \/>Another good (more real life) example can be found in the Use Your Loaf TaskTimer project (see below); look at the<strong><span style=\"font-family: 'Courier New';\">UYLCounterView.m<\/span><\/strong> file<\/li>\n<\/ul>\n<p><strong>Accessibility Actions<\/strong><\/p>\n<ul>\n<li>If you are creating a custom adjustable control, you need to give VoiceOver information on how to manipulate its value.<\/li>\n<li>VoiceOver has two standard gestures: swipe up (increases the value of something) or swipe down (decreases it).<\/li>\n<li>So when coding your custom control, you need to create special &#8220;increment&#8221; and &#8220;decrement&#8221; code that VoiceOver can use to change its value.<\/li>\n<li>A good example of this is the page turner in iBooks (the little dotted line with the box at the bottom that lets you quickly page through a book).<\/li>\n<li>A third type of gesture is &#8220;scroll.&#8221; This is meant for a control that scrolls to a different part of your UI. Example: moving between home screens, or scrolling between cities in the Weather app.<\/li>\n<li>Example:<a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<br \/><\/a>Look at &#8220;action code 1&#8221; and &#8220;action code 2&#8221;<\/li>\n<\/ul>\n<p><strong>UI Changes<\/strong><\/p>\n<ul>\n<li>The iOS user interface is very dynamic. Things are moving around, morphing, swooping in and out, etc. Obviously blind users can&#8217;t see this. So iOS provides a way for developers to let the user know that &#8220;something happened&#8221; using VoiceOver.<\/li>\n<li>There are three types of UI change notifications.<\/li>\n<li><span style=\"text-decoration: underline;\">Screen changes<\/span>: when your UI changes dramatically. Usually when a user moves into a different part of your app (navigates to a different screen). VoiceOver notifies the user with a tone, and it clears its caches and does other preparations to deal with a new set of accessibility data.<\/li>\n<\/ul>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);<\/span><\/strong><\/li>\n<\/ul>\n<li><span style=\"text-decoration: underline;\">Layout changes<\/span>: if some part of your UI changes, but the user hasn&#8217;t necessarily jumped to an entirely different part of your app. (Example: in the iTunes Store app, tapping on the price label ($0.99, etc.) next to a song changes it to a &#8220;Buy&#8221; button.) This notification tells VoiceOver to re-read the current state of all accessible items that are on-screen, and by doing this it figures out what has changed and informs the user of those changes.<\/li>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);<\/span><\/strong><\/li>\n<\/ul>\n<li><span style=\"text-decoration: underline;\">Dynamic changes<\/span>: if a part of your user interface is dealing with some dynamically changing information (state changes, data changes, etc.). This notification tells VoiceOver to read it out to the user. Example: in the Compass app, the compass value is constantly changing as the user moves his\/her device in space. The Compass app sends a dynamic changes notification that tells VoiceOver to read out your current heading. Also useful for communicating any sort of significant status change in your app (&#8220;Loading complete,&#8221; &#8220;Connected to server,&#8221; etc.) You may only want to do this when a significant change in data has occurred, otherwise it can get real annoying. (for example, Compass only notifies when the compass value has changed by 5 degrees I believe.)<\/li>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @&#8221;Loading complete.&#8221;);<\/span><\/strong><\/li>\n<\/ul>\n<p><strong>VoiceOver-specific API<\/strong><\/p>\n<ul>\n<li>Sometimes it is useful to determine whether or not VoiceOver is running, and to do different things depending on whether it is or not.<\/li>\n<li>A program can, at any time, test to see whether VoiceOver is enabled or not.<\/li>\n<\/ul>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">if (UIAccessibilityIsVoiceOverRunning()) {<\/span><\/strong><br \/><strong><span style=\"font-family: 'Courier New';\">  \/\/ VoiceOver is active; do something different<\/span><\/strong><br \/><strong><span style=\"font-family: 'Courier New';\">}else {<\/span><\/strong><br \/><strong><span style=\"font-family: 'Courier New';\">  \/\/ VoiceOver is NOT active; do the usual thing (whatever that may be)<\/span><\/strong><br \/><strong><span style=\"font-family: 'Courier New';\">}<\/span><\/strong><\/li>\n<\/ul>\n<li>Also, programs can sign up for the system to notify them whenever the VoiceOver status changes.<\/li>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleVoiceOverStateChange:) name:UIAccessibilityVoiceOverStatusChanged object:nil];<\/span><\/strong><\/li>\n<\/ul>\n<li>Your program can also tell where VoiceOver&#8217;s &#8220;focus&#8221; (the object that it&#8217;s dealing with) is, and when &#8220;focus&#8221; enters or leaves any given object.<\/li>\n<ul>\n<li><strong><span style=\"font-family: 'Courier New';\">accessibilityElementIsFocused<\/span><\/strong><\/li>\n<li><strong><span style=\"font-family: 'Courier New';\">accessibilityElementDidBecomeFocused<\/span><\/strong><\/li>\n<li><strong><span style=\"font-family: 'Courier New';\">accessibilityElementDidLoseFocus<\/span><\/strong><\/li>\n<\/ul>\n<li>A good use for this is, when a user is running VoiceOver, to present a more simplified UI to them, or otherwise change your UI to make it easier for VoiceOver users to interact with. Example: In the Photos app, the photo controls normally disappear after a few seconds to let you view the full image. This could be confusing to VoiceOver users; so if Photos detects that VoiceOver is in use, it prevents this auto-hiding behavior.<\/li>\n<div><strong>Testing Accessibility<\/strong><\/div>\n<div><strong><br \/><\/strong><\/div>\n<div>\n<ul>\n<li>Naturally, like any other aspect of software development, you&#8217;ll want to test your accessibility code.<\/li>\n<li><span style=\"text-decoration: underline;\">In the iOS simulator<\/span><\/li>\n<\/ul>\n<ul>\n<li>The iOS Simulator has a built-in Accessibility Inspector. It displays all the accessibility data of any given object on screen (just click on it).<\/li>\n<li>Access it by pressing the virtual Home button, launching the Settings app (you might have to swipe right to get there), tapping on General, then Accessibility, then turn on the Accessibility Inspector.<\/li>\n<li>Example: <a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<br \/><\/a>Look at &#8220;Accessibility inspector&#8221;<\/li>\n<\/ul>\n<li><span style=\"text-decoration: underline;\">On real devices<\/span><\/li>\n<ul>\n<li>Unfortunately the accessibility inspector doesn&#8217;t support certain actions (notably the swipe gestures that let you change values of controls). Also it doesn&#8217;t really give you a &#8220;feel&#8221; for how an actual blind user would interact with your app. For this you really need to test on real hardware.<\/li>\n<li>To enable accessibility &#8211; Settings -&gt; General -&gt; Accessibility -&gt; VoiceOver -&gt; turn it ON.<\/li>\n<li>A shortcut is to set up the triple-click home button shortcut: Settings -&gt; General -&gt; Accessiblity -&gt; Triple-click Home -&gt; set it to VoiceOver<\/li>\n<li>If you&#8217;re feeling really brave, you can enable Screen Curtain (completely turns off the screen, the closest thing to actually turning yourself into a blind person, and much more comfortable than a blindfold (or poking your eyes out)). Just activate VoiceOver then triple tap using three fingers. Repeat to turn off screen curtain.<\/li>\n<\/ul>\n<li>Of course, doing your own testing is fine (and indeed is essential), but you really should be sending your app out to others to test.<\/li>\n<\/div>\n<p><strong>Miscellany<\/strong><\/p>\n<ul>\n<li>If you localize your app, you also need to localize your VoiceOver prompts! (VoiceOver is available in 30 languages)<\/li>\n<\/ul>\n<ul>\n<li>If you&#8217;re not localizing, you really ought to. The App Store is global, why shut out a potentially huge user base? Getting translators is easy and relatively inexpensive (try Craigslist).<\/li>\n<li>Remember that localization doesn&#8217;t just mean translating words and letters; some countries have different ways of expressing date\/time, currency, etc. iOS has code that helps in these conversions.<\/li>\n<\/ul>\n<li>It&#8217;s always good to think outside the box.<\/li>\n<ul>\n<li>With clever use of the accessibility tools, you can make things accessible that you wouldn&#8217;t think were possible.<\/li>\n<li>A good example is the Stocks app. You&#8217;d think that there is no way that the graph at the bottom could be made accessible. You would be wrong.<\/li>\n<li>They used accessibility areas to slice up the graph. For each slice, it tells you a representative date within that period, and the stock price for that date.<\/li>\n<\/ul>\n<li>Less is more.<\/li>\n<ul>\n<li>Keep your labels short. Users are going to be scrolling through these dozens of times.<\/li>\n<\/ul>\n<ul>\n<li>If you want to provide additional information, use an accessibility hint. (That way users only get the additional information if they actually need it)<\/li>\n<\/ul>\n<li>The more buttons, interactive elements, etc. on a screen, the harder it is for a VoiceOver user to navigate it.<\/li>\n<ul>\n<li>If you really want the fancy UI, check to see if VoiceOver is in use; if it is then present a simplified UI.<\/li>\n<\/ul>\n<li>Do not include an object&#8217;s type (&#8220;button,&#8221; &#8220;slider,&#8221; etc.) in its accessibility label. iOS will automatically read out the item&#8217;s type itself, so there&#8217;s no need for you to do so also (besides it makes your app look amateurish).<\/li>\n<li>Remember that there are other disabilities besides blindness.<\/li>\n<ul>\n<li><span style=\"text-decoration: underline;\">Physical Disabilities<\/span>:Try not to make your UI teeny tiny. Of course this makes it more difficult for sighted people to use your app. But it becomes orders of magnitude worse when you throw physical disabilities into the mix(motor control difficulties, CP\/MS, or people who use a head-mounted pointer, etc.) It also makes it harder for visually impaired (but not completely blind) users to see your app as well. IMHO this might be a compelling argument for a larger-screened iPhone (more space to spread out your UI in).<\/li>\n<li><span style=\"text-decoration: underline;\">Deaf\/Hard of Hearing<\/span>: Some programs use sounds to indicate that something happened. It&#8217;s always a good idea to also include some sort of visual feedback as well, for those who are deaf\/HOH.<\/li>\n<\/ul>\n<li>Use standard controls (text entry fields, buttons, etc.) whenever possible. Not only is this good for usability (users <em>know<\/em> what an iOS text box\/button\/on-screen keyboard\/etc. look like, they may not be able to instantly recognize your weird nonstandard UI); but using standard UI elements also gives you the highest level of compatibility with alternative input devices (head pointers,braille displays\/keyboards, etc.). (Bad example of this is Mac OS Ken&#8217;s Secret Crypto Wonder Badge. Totally nonstandard keyboard.)<\/li>\n<p><strong>Resources<\/strong><\/p>\n<ul>\n<li>Apple&#8217;s Worldwide Developers Conference (WWDC)<br \/>Conference info and registration:  <span style=\"color: #000000; font-family: Arial;\"><a href=\"https:\/\/developer.apple.com\/wwdc\/\">https:\/\/developer.apple.com\/wwdc\/<br \/><\/a><\/span>Videos of all conference sessions (2010 and 2011&#8217;s are up now, 2012&#8217;s will be up a few weeks after the conference is over):  <span style=\"color: #000000; font-family: Arial;\"><a href=\"https:\/\/developer.apple.com\/videos\/\">https:\/\/developer.apple.com\/videos\/<br \/><\/a><\/span><strong>Note: conference videos are now available even to free developer program members!<\/strong><br \/>If you&#8217;re a serious developer, you need to go to WWDC. Unfortunately it tends to sell out pretty fast, so you&#8217;ve gotta be quick! They do make all conference videos available to paid developer program members; however, the real benefit of attending WWDC is that you get one-on-one &#8220;face time&#8221; (f you&#8217;ll pardon the pun) with real live Apple engineers who help you with your coding issues and help make your apps better.<\/li>\n<li>Apple&#8217;s iOS Accessibility Programming Guide:<a href=\"http:\/\/developer.apple.com\/library\/ios\/#documentation\/UserExperience\/Conceptual\/iPhoneAccessibility\/Accessibility_on_iPhone\/Accessibility_on_iPhone.html\">http:\/\/developer.apple.com\/library\/ios\/#documentation\/UserExperience\/Conceptual\/iPhoneAccessibility\/Accessibility_on_iPhone\/Accessibility_on_iPhone.html<\/a><\/li>\n<li>Stanford CS193P iOS programming course on iTunes U:<a href=\"http:\/\/itunes.apple.com\/us\/course\/ipad-iphone-app-development\/id495052415\">http:\/\/itunes.apple.com\/us\/course\/ipad-iphone-app-development\/id495052415<\/a><\/li>\n<li>CS193P Accessibility lecture:<a href=\"http:\/\/www.youtube.com\/watch?v=5b0V6MltEnw\" search_id=\"undefined\">http:\/\/www.youtube.com\/watch?v=5b0V6MltEnw<br \/><\/a>Slides from this lecture: <a href=\"http:\/\/www.stanford.edu\/class\/cs193p\/cgi-bin\/drupal\/system\/files\/lectures\/Accessibility.pdf\">Accessibility.pdf<br \/><\/a>In the past the CS193P course has had a lecture on accessibility; for some reason they didn&#8217;t in this year&#8217;s iteration of the course. Fortunately a video of the previous year&#8217;s accessibility lecture is still on YouTube. In this lecture the speaker gives a good overview of the accessibility API&#8217;s. He also does a demonstration in which he takes a completely inaccessible app (a bowling game), and in a few simple steps, makes it completely accessible and playable by even completely blind users.<\/li>\n<li>&#8220;Smartphones Become Essential Accessories for the Blind&#8221;:<a href=\"http:\/\/www.youtube.com\/watch?v=NQKtSR5Li1A\">http:\/\/www.youtube.com\/watch?v=NQKtSR5Li1A<br \/><\/a>This video was shown during the Stanford class above. It is a great overview of how the iPhone is really revolutionizing the way blind and visually impaired people interact and function in their daily lives.<\/li>\n<li>VoiceOver article at Use Your Loaf: <a href=\"http:\/\/useyourloaf.com\/blog\/2012\/4\/23\/voiceover-accessibility.html\">http:\/\/useyourloaf.com\/blog\/2012\/4\/23\/voiceover-accessibility.html<br \/><\/a>Another good overview of iOS accessibility (basically what we covered here). He has also provided a downloadable Xcode project with working code samples illustrating all of the various methods of adding accessibility to an app; developers should definitely should download that and take a look.<\/li>\n<li>My screenshots, pictures, etc.: <a href=\"https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c\">https:\/\/www.dropbox.com\/gallery\/169813\/1\/iOS%20Accessibility?h=1f050c<\/a><\/li>\n<\/ul>\n<p><strong>The obligatory plugs section<\/strong><\/p>\n<ul>\n<li>Check out my iOS apps!<\/li>\n<\/ul>\n<ul>\n<li>Otaku no Podcast (free): <a href=\"http:\/\/otakunopodcast.com\/app\/\">http:\/\/otakunopodcast.com\/app\/<\/a><\/li>\n<li>SongTweeter (free): <a href=\"http:\/\/SongTweeterApp.com\/\">http:\/\/SongTweeterApp.com\/<\/a><\/li>\n<li>NerdTool ($1.99): <a href=\"http:\/\/NerdToolapp.com\/\">http:\/\/NerdToolApp.com\/<\/a><\/li>\n<\/ul>\n<li>My portal site &#8211; links to everything I do, as well as houses my blog. <a href=\"http:\/\/DonaldBurr.com\/\">http:\/\/DonaldBurr.com\/<\/a><\/li>\n<li>I&#8217;m on twitter as <a href=\"http:\/\/twitter.com\/dburr\/\">http:\/\/twitter.com\/dburr\/<\/a><\/li>\n<li>And finally, if you are at all interested in Japanese animation (Anime), comics (Manga), food, travel, culture, etc., check out my podcast, Otaku no Podcast. <a href=\"http:\/\/otakunopodcast.com\/\">http:\/\/otakunopodcast.com\/<\/a><\/li>\n","protected":false},"excerpt":{"rendered":"<p>These notes were created by Donald Burr of Otaku No Podcast from otakunopodcast.com. Donald was the guest on episode #364 of the podcast. If you&#8217;d like to listen to the audio as you read along, click the link below: Donald Burr on Accessible App Development How to Build Accessible iOS Apps by Donald Burr When [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4374,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[],"tags":[153,9],"class_list":["post-2993","page","type-page","status-publish","hentry","tag-ios-tutorials","tag-tutorials","post"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/pages\/2993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/comments?post=2993"}],"version-history":[{"count":12,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/pages\/2993\/revisions"}],"predecessor-version":[{"id":4301,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/pages\/2993\/revisions\/4301"}],"up":[{"embeddable":true,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/pages\/4374"}],"wp:attachment":[{"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/media?parent=2993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/categories?post=2993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.podfeet.com\/blog\/wp-json\/wp\/v2\/tags?post=2993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}