Transcript
>> Gregory Hughes: Good morning.
My name is Gregory Hughes and I'm
a software engineer at Apple.
I'm really excited to be able to have the
opportunity to speak to you this morning,
and today you're going to learn how
to use universal design principles
to make your applications better and more accessible.
And I want to start off by explaining
what I mean by universal design.
And to illustrate universal design, I thought I
would use something we're all very familiar with,
and that's the kitchen stove.
I'm sure most of you use the kitchen
stove on a very regular basis
and most people accept the design of the kitchen stove.
However, it turns out that the design is actually quite
poor, specifically the row of knobs across the front
and the back of the stove that
are used to control the burners.
Each of these knobs requires a small icon or a localized
label to tell a user what burner that knob controls.
Now I know with this design I personally
have accidentally turned on the wrong burner
and this is a really, really common mistake.
And in the case of a stove, it can
actually be a very dangerous mistake.
Now, users make this mistake for a number of reasons.
Perhaps, they're in a hurry preparing dinner
for guests, maybe water is boiling over
or maybe the user just forgot their glasses in another room.
However, with this design, there are
also a number of accessibility concerns.
For someone with low vision, it can be
very difficult to read these labels.
For someone who is completely blind, it could be really
difficult to figure out which knob controls which burner.
And for someone with a cognitive impairment, it
can be very difficult to create the mental mapping
between this row of knobs and the matrix of burners.
So if we design the stove more universally, if we
think about the needs of all users including users
with disabilities, we can end up making a much better stove.
If we rearrange the knobs so that
they're in the same order as the burners,
the stove becomes much easier to use for everyone.
You no longer need to read a label.
You instantly know which knob controls which burner.
It's now also more accessible because someone with
low vision doesn't need to read a label and someone
who is blind is able to feel the knobs and
know exactly which burner that knob controls.
And equally, someone with a cognitive impairment will
have a much easier time making the mental mapping
between the arrangement of knobs
and the arrangement of burners.
In the case of the stove, an equally valid
design choice may be to rearrange the burners
so that they're in the same order as the knobs.
So we see here by applying some universal design
principles, by looking at the needs of all of our users,
we end up making a much more usable,
much better product for everyone
that everyone will have an easier time
using and will reduce user frustrations.
And so that's what I would like to talk to you today
about: How you can apply these universal design principles
to your software to make it better for everyone so that your
users experience less frustrations in using your software.
At the same time, you'll be making
your software more accessible.
And to talk about that today, I have three main focus areas.
First are the end users.
Now with all design, you want to start thinking
about the needs and requirements of your users.
Oftentimes universal design goes hand in hand with the term
user-centric design, and that's design focused on the users.
So, not only do you want to think about the users here
but you want to think about how and where and potentially
when they'll be using your software
and under what circumstances.
So then, I'd like to speak about some of the accessible
technologies that Apple has built into a number
of our products, and these help highlight how
accessible technologies also make products better.
These universal design features are making the operating
system and our portable products better for everyone.
And last, I want to talk about how you the developers
specifically can make enhancements to your applications
to make them better for everyone
and more universally designed.
So, let's start with the users.
And to get an idea of what we're talking about
here, I want to start off with some statistics.
In the U.S., 10 million people have a vision
impairment, 31 million people have hearing impairment,
and 12 million people have a learning disability.
And what that means is that 1 in 5
people in the U.S. has a disability.
That's 50 million people.
Let's stop and think about that for a minute, 50
million people have a disability in the U.S. alone.
By making yourself more universally designed
and more accessible, you're going to be able
to have a much easier time reaching
this huge percentage of the population.
At the same time, you can have an easier time
entering government and education markets,
which often require your software to be accessible.
So there's a huge potential audience here
especially world-- including worldwide.
So to look at this audience, there are
4 main areas we want to think about.
First are visual considerations, and these
are considerations pertaining to vision.
These are considerations for users that perhaps have
reduced visual acuity, users that are maybe color blind,
or users that are completely blind, and even users
that just don't have their glasses with them.
Then, we have auditory considerations and these are
considerations for users with hearing impairments.
Users who can't hear as well as the average
user or users who can only hear out of one ear.
This also includes users who are completely deaf.
And then we have physical considerations,
and these are considerations for users
that have a hard time physically
interacting with a computer.
These are users who have a difficult
time using the keyboard or mouse.
And then cognitive considerations,
and these are consideration
for how a user thinks when they're using your software.
This potentially includes users with
learning disabilities and other users
who just need an easier time using your software
who would benefit from a more simplified interface.
So we've now talked a little bit
about the users and let's look at some
of the technologies that Apple has to address these users.
First is a very common universal design feature that
you'll see a lot this week, and that's Fullscreen Zoom.
This is used a lot in presentations to highlight a
specific portion of the screen, but it's also indispensable
for a user with a vision impairment because they're
able to zoom in on various areas and enlarge the font.
There's a number of these large
font solutions across the OS.
In Address Book, you can make phone numbers large print.
This is great if you're sending a fax from across the
room but also wonderful for someone with lower vision.
In the Dock, the Icon Magnification helps
someone with low vision see the icons,
but it's also really aesthetically pleasing.
So we see how these features make the software more usable
and at the same time have the benefit
of making it more accessible.
We have closed captioning in iTunes, iPods, iPads,
iPhones and pretty much everywhere we have video.
This is obviously really important for someone who
is deaf, but it's also crucial if you're trying
to watch something while on the gym or in the airport
and you don't have the ability to wear headphones.
Or maybe you want to want a documentary in the
library and you can't listen to the sound there.
So, again another universal design feature that's helping
everyone but is also increasing the accessibility of video.
There's also-- we have talking iPods, and this originally
was designed for people who are completely blind
so they could interact with the iPod and listen to their
music, navigate through the menus, but it's also very usable
for someone who's driving a car perhaps and
they just want to scroll through their music
without diverting their visual attention.
And now this interface turned out to be so usable and so
successful it's the only interface on the new iPod shuffle.
So it's a great, great universal design feature that turned
out to be the only method of interaction in newer hardware.
And then we have VoiceOver, and VoiceOver
is Apple's screen reading solution.
And what this does is it converts all of the wonderful
graphical information on the screen into spoken information
so that someone who is blind can use a computer.
And VoiceOver now has been shipping for 5
years and it's installed on millions of Macs.
And this number is really important because the
VoiceOver now is installed on more computers than all
of the other screen reading solutions combined.
And that's really important because it shows what a huge
role Apple is playing in the assistive technology market
and how important it is for you as
well to make your software accessible.
VoiceOver now is also shipping on the
iPhone as of the iPhone 3GS and on the iPad,
along with a slew of other universal
design features that help all users,
and most of these you don't even think about.
For example, Pinch to Zoom in Safari.
We all use that but it's a great feature
for someone who is visually impaired.
And so if we think about some more of these features
that we can add, we end up making better software.
So with that, I'd like to look at
how we can make better software.
What you can do to your applications and how to look at your
applications to find these areas that could be improved.
So remember, we have these 4 groups:
visual, auditory, physical, and cognitive.
And when looking at these 4 groups, we
have 4 categories that we want to think of.
The first is perceivable.
Can the user perceive the information
you're trying to present?
Do they have the ability to get the information?
This is generally going to deal
with the output of your application.
Is your software operable?
Does the user have the ability to operate your software?
Can they provide the input that you're expecting?
Is it understandable?
Does the user understand what you're
trying to present to them?
Do they understand the UI?
And is it robust?
Can your software adapt to the very needs of users in the
varying situations where they might use your software?
And so, this ends up forming a nice grid and you
can actually use this as a report card to go through
and look at your software, and it helps you
to think about all these different areas
and we would love you to get A+
marks across this report card.
And if that's the case, you end up having much better,
much more well-designed software for all of your users.
And throughout this talk, I'm going to use a small sample
app to highlight some of these universal design features.
This is a portfolio watcher.
It just watches some stock, shows me how
they're doing and gives me my day's change,
and we'll see how we can improve
this through universal design.
So first let's look at these-- the visual
considerations, and generally these considerations fall
into the perceivable category because
we're dealing with vision.
Can a user perceive the output
that you're trying to present?
And to start, let's look at iTunes.
Now, iTunes has a wonderful high resolution interface and
in the iTunes Store, they're displaying a lot of content.
And you can resize the iTunes window
and resize even smaller.
And as it turns out, this is really important for
accessibility because a very common technique for someone
with low vision is to increase the screen resolution.
And so having your window be resizable, usable at all
resolutions, it makes your application much more accessible,
and at the same time it gives all users
the ability to control the window size
and it lets the user select what
window size works best for them.
So generally, we recommend that your
applications be usable down to at least 1024x768.
And the important distinction here is
that it's usable at that low resolution.
We really want you to develop beautiful high resolution
interfaces to take advantage of our large displays,
but you always want to keep in mind that
some users are using these lower resolutions,
so you want all of your features to
be accessible at these resolutions.
This is also going to help when presenting your software.
You never know when you're going to connect to a
projector that's 800x600 and you don't want to be caught
in a situation where you're giving an important presentation
only to have half of your features inaccessible.
And that's going to help pretty much anyone who is reducing
their resolution to help release-- relieve eye strain.
I know a lot of travelers do this
often when working on an airplane.
It's really, really simple to do right at Interface Builder.
You just want to set the minimum size of your window
to the absolute minimum size usable
and then check your application.
And sometimes this might involve adding some scroll areas
here or there, but in general it's really, really easy.
So next, I want to look at Mail.
And here's a screenshot of Mail and I'm sure it's very
difficult to see especially if you're sitting in the back.
And if I blur it a little bit, it helps us to simulate what
it might look like to someone with a vision impairment,
and now it becomes absolutely impossible to read.
Now, Mail has a wonderful feature that's
used by everyone and it makes Mail better.
You can adjust all of the font sizes in Mail.
And now this is great for any user or someone who's
presenting Mail and showing off the interface,
and you can make that even bigger, which
is wonderful for someone with low vision.
And so this is a really, really important
feature that makes the software much more robust.
And you'll see this across a number of Apple applications.
In the System Preferences, you can often
change the font from the Key Content area.
Sorry, in the Application Preferences.
And the Key Content area is the important distinction here.
You want to look at your application and figure
out where users spends most of their time visually,
and concentrate your attention on trying to make the
fonts in that area larger or at least user sizeable.
So in an application like Safari, the
Key Content area is easy to determine,
it's the large web area, but sometimes
it's a bit more difficult.
So this obviously is going to help users with low vision.
It's going to help elderly users, users who
don't have their glasses with them, and again,
it's going to help you if you're ever
presenting your software so that users,
so that people in the audience are able
to see what you're presenting to them.
It's really, really simple to do.
What I recommend is creating one
bottleneck in your application.
And at this point I do want to mention that all of
the source code I'll be presenting here is available
on the WWDC web site so you don't need
to worry about copying any of it down.
So if you create a single point in your application,
you can always ask that method for
the current user to find font size.
And here is just a quick example, I'm asking System--
or asking my Application Preferences for the font size, then
bounds checking it and returning the user desired font size.
To use it is easy.
I'm going to ask NSFont for a system font of that
size and I'll get back a valid NSFont that matches all
of my other system fonts, and then I can just apply
that to any NSTextField really, really easily.
Now, the other very common area
for adjusting fonts is in tables,
and tables are slightly more involved
but still not that difficult at all.
For a table, remember we have columns
and so we need to iterate
through the columns and set the font for each data cell.
So we go through that here.
Going through the columns we grab the data
cell and then set the font for the data cell.
And then the only slightly tricky part is now that we're
increasing the font, we need to change the row height.
So in order to do that, we can ask
NSLayoutManager for the line height for our font
and then set the row height appropriately.
So as you can see a bit more involved, but still
really, really simple and not much work at all
to make the fonts in your application resizeable.
Next, I want to look at another interface
that probably looks very common to you.
So let's just demonstrate-- this interface is
showing two stocks and showing their day's change.
However, for a user who is color blind, this
interface doesn't convey any information.
I don't know if the stock is going up or going down.
So the important thing here to keep in mind is
never to use color alone to convey information.
So using color is just fine and it's a really,
really nice way to quickly convey information.
Just don't use color alone.
And oftentimes this is simple to solve.
In this case, if we add a plus and a minus
sign, it now will tell a user who is color blind
which stock is going up and which is going down.
So the difference is very, very small here but it
can make a world of difference to a lot of users
who are using your software, and it's also going
to make your software easier for everyone to use
because it's now going to be quicker
to glance at because we have color.
And if you're looking at it more closely,
you have the plus and the minus sign.
So all of that is really good for our low vision
users, but what about users who can't see anything?
How are they going to access this visual information?
And as we saw with the case of color, we don't
want to convey information with color alone.
As it turns out, we don't want to
convey information through vision alone.
We want to be able to provide a
spoken interface to every application.
And on that front, all of the hard work is actually
already done, and that's done through VoiceOver.
Remember, VoiceOver is the screen reader which is going to
convert all the visual information into spoken information.
But sometimes it requires a bit of work on
your part to make your application more usable
with VoiceOver, and that's really easy to do as well.
In Interface Builder, you can set the
Accessibility Description, Help Tag, Title Element
and Linked Element without ever leaving IB.
So it's really, really simple to do this for
any of your controls that you have right in IB.
As well, there's a programmatic way to do this.
You can use the convenience method set accessibility
override, and here you can set the override for any
of your standard controls for its Accessibility
Description, Help Tag, Title, or Linked Element.
Now, if you have a control that is your own custom view,
you will need to do a bit more work for accessibility,
and there's some great past talks on that.
I encourage you to look at the WWDC 2009
talks, and they go into great depth on how
to make your custom views more
accessible and usable by VoiceOver.
But for today, let's just look at the standard cases.
So, with that, I'd like to show you here how we can
apply some of these techniques to our sample application.
So, here we have Xcode.
If I run my app here, it's the sample app that I
showed you in the slides and we can look at this window
and I can't resize it much more than this, which
can be frustrating for any user who just wants
to make the window small and push
it to the side of the screen.
So let's go into IB and fix that.
So here we have our window.
If we bring up the inspector for the window size-- but
here it's already set to a minimum size of 900 and I know
that my application can be resized all the way down to 450.
So really, really simple to change,
we switch and look at that now.
I can resize the window quite a bit smaller.
So a small change has a significant impact for the
accessibility and usability of your application.
Next, let's take a look at fonts.
So here, if I look at my Preference window,
I see that someone has already left me
a convenient place for a font slider.
So if we bring up the library here and add a slider,
you see that the designer has also already decided
that we want a font size between 8 and 40, and this range
will probably be dependent on your application but 8
and 40 is probably a pretty decent range to be considering.
And I want to make sure that my bounds of the slider
are the same so I'm going to set those to 8 and 40.
And I also want it to update continuously.
And now for my slider, I'm going to bind it to my delegate
and I'm going to bind it to the font size property.
So if we save that, we can now go into Xcode and look
at the methods that we need to control the font size.
So let's bring up the delegate, and I'm
sure if you have ever worked with bindings,
you know the first thing you'd really want to do is make
sure you add your getter and setter for the property.
So let's add those now.
Here we have first a very simple setter.
We're going to take in a value, and first because
we never want to be dealing with fractions
of a point, we're going to round the value.
Then store in Preferences, Synchronize Preferences,
and update the fonts for my application.
The getter is equally simple.
I load the value from Preferences then
bounds check it against my lower bounds.
You may also want to check your upper bounds and then again
return a rounded value because I want to just doubly check
that I'm never dealing with fractions of a point.
So now we need to get a system font, an NSFont of that size.
So that as well is really easy.
We're going to get the font size that the user
wanted and ask for a system font of that size.
And now we have our method here which
is going to do the updating for tables.
Remember, we're going to iterate over the columns,
apply the font to each data cell and
then lastly update the row height.
So a bit more involved for tables
but still really, really easily.
And now the last thing we need is
the actual method to do the work.
And if we add this method here, we see for our
three text labels, we're going to set the new font
and then for our two tables, we're
going to set the font of those tables.
And now to make sure I always have
the current user preference,
I want to make sure to call updateFonts
in my awakeFromNib method.
So at the end of awakeFromNib, I'm going to
call update fonts and let's run the application.
So now if I bring up our Preferences here, I have this font
slider and I can adjust all of the fonts of my application.
And you'll see here we have a slight problem.
Our two labels are being cut off.
And let's go and fix that.
[ Pause ]
So in our updateFonts method, we
just need to also update the layout
of our UI, so I'm going to call self updateLayout.
And now that's going to call a
method that I've already written.
The method is a bit long but the
logic is really, really simple.
It's all just basic math, laying out the controls
appropriately within my view, and when possible,
letting Interface Builder take advantage of all
the springs and structs that I've already defined.
So let's take another quick look.
So now when I adjust my font, all of my
controls layout and resize appropriately,
and I think that's probably a good font size.
If I'm demoing my software, now it's
much easier for everyone to read.
So next I spoke about VoiceOver and how we want to
make sure our application has this audible output.
Now, there're some really great tutorials on
how to use VoiceOver built right into the Mac.
When you turn on VoiceOver, you'll have the
opportunity to learn how to use VoiceOver.
But for today, I just want to let you listen to what a
VoiceOver user might hear when navigating our application.
>> Unknown: VoiceOver on portfolio watcher
window, portfolio watcher edit text, add a symbol.
>> Gregory Hughes: So here we hear add a symbol,
and if I go through the UI we'll hear each element.
>> Unknown: Edit text, blank button.
>> Gregory Hughes: So here we see one
problem, VoiceOver just says button.
VoiceOver doesn't have enough information
to tell the user what this button does.
And so we'll have to go in and
add a description for that button.
Let's continue along.
>> Unknown: Table one row selected, symbol AAPL, name Apple.
>> Gregory Hughes: So it works fine for the
table and you'll find that it works fine
for any standard Cocoa control,
especially the text controls.
It's generally your custom controls or any graphical
elements that you'll need to do a little bit of work for.
>> Unknown: Days change zero dollars
and 82 cents, zero button.
>> Gregory Hughes: And so again we have this other button.
And those aren't accessible because they
have images and we're just going to need
to provide a quick description for those buttons.
Let's do that now.
>> Unknown: VoiceOver off.
>> Gregory Hughes: If we're going to Interface Builder,
I can have the description for one button right here.
Right here under accessibility description,
I'm going to call this the Fullscreen button.
And just to show how to do it, I'll
label the other button programmatically.
So if we switch back to Xcode and I have a small
two line method here to update the other button,
we see we're going to grab a localized string
because just like our UI it needs to be localized.
Our strings for VoiceOver need to be localized, and I'll
set that string as the description for the button cell.
I also need to make sure to call this method when I
awakeFromNib just like I wanted to update my fonts.
So at the end of my awakeFromNib I'm going to call self
updateAccessibility and let's take a quick look at that.
>> Unknown: VoiceOver on portfolio
watcher window, portfo-- add stock button.
>> Gregory Hughes: So here we now
have a description for this button.
>> Unknown: Take date fullscreen button.
>> Gregory Hughes: And a description for our other button.
So you can see adding this basic accessibility
really doesn't take that long at all.
It just involves going through your application, finding
the areas that need a little bit of work and updating them
so that VoiceOver has something
to speak for all of your controls.
>> Unknown: VoiceOver off.
>> Gregory Hughes: So next I want to talk about audio
considerations, and again these are considerations for users
with hearing impairments, users who are perhaps
using mono audio or users who are completely deaf.
And to start out, I want to show a quick video.
[ Pause ]
Now, I'm willing to bet you can't get a whole lot of
information from this video because the only means
of output is audio and I muted the video.
So you can see how difficult it would be
for someone who's working in a library
or someone who's deaf to access that video.
Let's take another look at it.
[ Pause]
And now actually, this demonstration worked out pretty
well because there was actually supposed to be audio
with that second video, and it shows how important it is to
make sure that everything you're presenting is accessible.
You were still able to get the information
out of that video by reading the subtitles.
So the important part of audio is to make sure that
you're never presenting information using audio alone,
that you always have some other method of
conveying that same piece of information.
You also want to be aware that
some users are using mono audio,
that they don't have the ability
to hear the two stereo channels.
And also some users have sensitivity or
can't hear higher or lower frequencies,
so you may want to consider having
assignable user sounds in your preferences.
This is going to be up to your application and, you know,
how much flexibility you have with
what sounds are being played.
So if we want to make sure that we always have this
visual counterpart to our audio, how do you do it?
Well, one very convenient and easy way is to use NSBeep.
Now with NSBeep, there's a systemwide preference
that someone who's hard of hearing can set so that
when NSBeep is called, the screen will flash.
It looks a bit like this.
So, whenever you're going to use something where there's
going to be sound, if you want to play the system sound
but also provide that visual feedback, always use NSBeep
because it's going to give you that accessibility for free
for those users who have the need for the screen flash.
But there are a lot of other ways that you can display
visual information to go along with your sounds.
One of the really great ways is to use your Dock Icon.
For example, I've been demonstrating
the stock watching application.
If my application, if my stock portfolio dropped
a huge percent in a small amount of time,
I might play a sound to warn the user, or
I could also change my Dock Icon to be red,
and it provides that visual feedback
that goes along with the sound.
Equally, I may change the Icon to green
if the portfolio is doing well, again,
providing visual feedback to go along with the sound.
And so we see here the importance of providing these
multiple methods of information output to a user and it ends
up making the application much more
usable for everyone, much nicer to use
and it helps convey all the information
you want to convey in an easy manner.
So, changing your Dock Icon is really, really simple.
In two lines of code given the PNG, you can set your
Dock Icon to pretty much whatever you would like.
But there's a lot more that can be done with the Dock Icon.
You can badge your Icon, and this is a
really convenient way and very common way
of conveying visual-- conveying new information.
For example when you get a new mail message, you hear the
new mail message sound but it's combined with the updating
of your unread message count in the Dock.
So it's that visual and audible component to the
information that mail is trying to present to you.
And you can also bounce your Dock Icon, and
this is a great way to visually tell a user
that your application wants attention
while it's in the background.
Maybe this goes along with an error
sound or some other method
of informing the user that you want-- you want attention.
So, I'd like to quickly show you now how
we can apply some of those techniques
and making our application more accessible
to users who are hard of hearing.
[ Pause ]
So here, if I go to my non-audible feedback section,
first, I'm going to add a method that calls NSBeep.
You can see how simple it is.
We'll just take a look at what that
looks and sounds like on a real system.
Next, we have how to change the Dock Icon and this
method looks a bit long but it's really, really simple.
All I'm doing is a bit of string coercion here.
My method takes in a number between negative 1 and positive
1 and then displays an icon that varies from red to blue
to green to represent the status of my portfolio.
So here, I take in the number.
I then find the appropriate image name for that number
and then these two lines here do all the
actual work of setting on your Dock Icon.
So, really, really simple here to change your Dock Icon.
Obviously now, I want to call this method from somewhere.
In my application, I have a timer
going to update my portfolio.
So, let me call that from my refresh method.
At the end of this method here, I'll call self
setDockIcon and I'll set to change percent sometimes 5.
So, in dealing with nonaudible feedback, you also want to
think about your application and what you might be able
to do to make your audible feedback
have some visual component to it,
and this could be different for every application.
This could be some animation that you provide
to go along with your audible feedback.
And just as a quick example of an animation that I chose,
here I have a message that's going
to flash my window different colors.
And so, I'm going to cycle through a few
colors and flash the window that color.
And so, just as playing sounds can sometimes be annoying,
some of these animations could be annoying to a lot
of your users and in that case, you want to make sure to
put them behind User Preferences, and that will allow a user
who needs this option to enable it where appropriate.
And the last one I want to show was bouncing a Dock Icon.
And because my application used to be in
the background to bounce my Dock Icon,
I'm going to call this on a delayed performSelector,
and then there's just one line to bounce my Dock Icon.
So, let's take a look at this now.
So we see here, first my Dock Icon is
green because my portfolio is positive.
If I now bring up the Preferences, we can
see what NSBeep looks and sounds like.
So, a great way to provide that visual feedback
automatically and it lets the user select
which sound they would like to hear,
which sound works best for them.
It can also bounce the Dock Icon, so a
great way of telling the user visually
that your application would like attention.
And lastly, just a quick very, very rough
animation, I can flash my window different colors.
And this might just tell the user different
statuses or different things have changed.
So there we have it, some very, very
simple changes that you can make
that will greatly help users with hearing impairments.
So now, let's talk about users with physical
impairments, the physical considerations
that we need to think about with our software.
These generally fall into the operable category.
Can a user operate your software?
Can they provide you with the input that you expect?
And when thinking about this category, we
want to look at the keyboard and the mouse.
These are generally the two primary
methods of providing input on Mac OS X.
And we want to think about users who perhaps
don't have the keyboard or can't use the keyboard,
or maybe users that don't have the
fine motor ability to use the mouse.
Meekly, we want to consider users that don't have either one
and are potentially using speech
input to control your applications.
As it turns out, there's a lot of permutations here
of the various input methods that could be used,
but they're all very simple to address. And you can address
them by providing full keyboard access to your application.
This is really simple to test.
Just try to use your application without using the mouse.
Try to make sure that you can use all the features
and all the functionality with just the keyboard.
That you can navigate to every single
control and use every single control.
Some of the tactics here to do this are to
provide keyboard shortcuts for the menu items
so that you can quickly activate
various options in your app.
So here, this is a great case where this universal design
feature is going to strongly or greatly help your super--
or your power users who want quick keyboard access to
the very commonly used features and at the same time,
you're going to be helping users with physical disabilities.
Now, two of the common areas that I've often
seen where full keyboard access is difficult are
in reordering lists and doing dragging and dropping.
Now, reordering lists is common-- are commonly done
by dragging one row and dropping it in a new position,
so somewhat difficult to do with the keyboard.
It turns out the solution is quite simple.
If you just add a moveUp and a moveDown command to your
Edit menu, you now allow a user to use their keyboard
to reorder any list that you have in your application.
And equally here, you'll see I've also bound this to
a keystroke, so the menu item has a keyboard shortcut
which is also going to help my power users.
Now, for dragging and dropping, for
example, an application that requires that--
where a user is going to move a photo from one album-- photo
album to another, instead of dragging it from that album
and dropping it in a different album, I could simply
cut it from one album and paste it in another.
So, by fully implementing cut, copy and paste,
we help get around the keyboard navigation
problems of drag and drop interfaces.
So, this is really, really easy to do and
it's implementing NSPasteboard protocol
and there's some great documentation online
on how to do this for your application.
So, I also said you want to be able to make sure that
you can get to all of the controls in your application
that you can Tab through your application.
And when doing this, you want to make sure to enable
full keyboard access, and what this is is a feature
in the operating system to allow a user to navigate
the entire operating system using the keyboard alone.
And in keyboard-- in system preferences under
keyboard preferences, you'll see here at the bottom,
there's a small checkbox to enable
full keyboard access to all controls.
You want to try this on when testing your application
to make sure that you can Tab to everything.
So, let's take a look at that now.
So, first let's take a look at reordering lists.
I'm going to go into Interface Builder.
I've already implemented the drag and
drop portion of reordering my list
and now, I need to add the keyboard access to it.
So, I'm going to bring up my Edit menu here
and add two items, moveUp and moveDown--
[ Pause ]
-- and also provide them with keyboard shortcuts.
Now, I've already written the prototypes for
these methods so I can go ahead and bind them.
And now, let's look at the work
that needs to be done in Xcode.
So, I've already written all of the methods, as I said,
for the actual dragging and dropping implementation
and the key here is that it's already architected well.
Here's my method that's dealing with the actual drop.
I mutate the numbers a bit to get
them in the format I expect
and then call my one method that does all of the work.
The method is called Moves Dock at Index to Index.
So, this is the method that's actually
going to do the work of reordering the rows.
And given this architecture, adding a moveUp
and moveDown command is really, really simple.
So we see here, moveUp is two lines.
We get the currently selected index in the table and then
we move that index to the currently selected index minus 1.
MoveDown is just as simple, we're just going to add 1.
So here, we see with 4 lines of code, we're going
to have greatly increased the keyboard
navigation of our application.
So, if I now Tab to my table, I can Arrow to my
table and then with Command and the Arrow keys,
I can move one of these stocks up or down in my list.
So you see, this is going to be great for yours-- your power
users who want to get it on to your application quickly,
but it's also going to be the way that users with physical
disabilities are going to be interacting with your software,
and so you want to make sure it's
all usable with just the keyboard.
And so now, we want to look at Tab navigation.
We want to make sure we can get to all of the
controls, and so the first thing here as I said,
we want to go to System Preferences and
make sure turn on full keyboard access.
So, we're going to turn on all controls here.
And now, I'm going to Tab through my application
and just make sure I can get to everything.
So, at the Add a Symbol field, I move
to Add a Stock button to the table
and then to this Fullscreen button at the bottom.
So, I can get to everything just fine here.
If I open up the Preferences, I'm starting
here at the Tab control at the top.
Pressing Tab moves me to the font slider,
and Tab again moves me to the negative color
and then backwards to the positive color.
And so, something is wrong there with the automatic
Tab ordering that was created by the operating system.
So, you always want to check your application,
make sure the Tab ordering is correct.
As it turns out actually, in this case, I had to play some
really evil tricks to get the Tab ordering to be incorrect.
So almost always, it will be fine.
But let me show you how you would
fix it if it were incorrect.
If I go into Interface Builder here and I look at my
Preferences window, what I want to do is first start
at the window, and I'm going to set the initial
key to this initialFirstResponder to my Tab control
and then for the Tab control, I want to set
the initial first responder to the slider.
From there, the slider's next key
view will be the positive color.
And from the positive color, the next
key view will be the negative color.
From the negative color, you want to make sure to make a
full loop, so we're going to go back up to the Tab control
and set the next key view to the Tab control.
So, let's take a quick look now.
So if I press Tab, I move from the
button at the top to the slider--
oh, and I didn't do something right,
so let's take another look here.
So from the slider, we want to go to the positive color.
Positive color to the negative color and
then negative color back up to the top.
So, if I press Tab from the button
at the top, I go to the slider,
then the positive color then to negative color and back up.
So really, really simple to test, really simple to fix
and it greatly improves the usability of your application,
again for those power users who want to get around quickly
and for users who don't have the ability to use the mouse.
As well as I said, this is going
to solve all of your input issues.
For users who are using speech input, they're going to now
be able to use Apple scripts to control your application
because it's fully navigable with the keyboard.
So, we solved a lot of problems
with a very small amount of work.
So, next are cognitive considerations,
and these are considerations
for how user thinks when they're using your software.
These are considerations for users
that perhaps have disabilities
like learning disabilities or maybe
even just the type of user.
For example, a student is probably going
to use your software in a different way
than a teacher is going to use your software.
And so, to look at cognitive considerations,
I want to look at iPhoto.
Now, iPhoto has a great interface and it's a
very, very powerful photo management application.
And it also allows me to edit my photos.
Now this interface can actually be a bit confusing
and overwhelming to some users because all you want
to do is just browse and look at your photos.
And iPhoto has done a great job solving this.
To do it, iPhoto has implemented Fullscreen mode and
in Fullscreen view, you can go through your album,
look at all of your photos and
eliminate all of the distractions.
Now, while in this mode, you can
also get to a lot of the UI.
You can get to the photo chooser by going up
to the top or the edit controls at the bottom.
So, this is really important because iPhoto is presenting
only the controls that the user needs when they need them.
So, it's eliminating distractions
and also hiding unnecessary UI
when it doesn't-- the user doesn't need the UI.
As it turns out here, entering this
Fullscreen mode is super, super easy.
You can do it with one line of code.
Given an NSView, you just say enterFullScreen
mode, provide it a screen
and there are few options that you can pass in as well.
So, really, really easy to implement this, a very,
very powerful way of making your application easier,
simpler to use for everyone, but also more
accessible to those users with cognitive impairments.
Now, I said iPhoto is hiding some UI and
hiding UI is really, really important here.
We want to make sure not to overwhelm a user with UI, so
you want to think about what options are more advanced,
what options are less used and see if you
can come up with ways to hide those options.
A great tactic is to use a contextual menu.
So perhaps you have a lot of buttons and 50 percent
of those are used by 2 percent of your users.
Consider putting those options in a contextual menu instead.
Another great way of hiding more complicated
or less used UI is to use menu alternates.
What this is, it's something we've probably all seen.
When you open up any menu in OS
X, you can press the Option key
and it will display different menu
items if they're provided.
For example here in the Apple menu, if I press
the Option key, a few of the items change.
Now, that was actually pretty difficult to notice
in the slide, but if we look at the two menus,
we see that about this Mac change the system profiler.
The system profiler is something that most users
never ever need but we still provide that option.
So, the important thing here is that you don't really want
to take away features from the user but at the same time,
you want to balance that with making your UI simple,
making all of the features used by 90 percent
of the users available all the time
and maybe hiding those other features
that are used by only 10 percent of your users.
So the-- to add a menu alternate,
you simply add a new menu item
and in Interface Builder say this is an alternate menu item.
What that means is that that menu item will replace
the previous menu item when a user presses the option,
so really, really simple to do and very powerful
nice way of hiding more advanced or less used UI.
So, let's take a look now at how to
do Fullscreen mode in our application.
So, if we switch over here to the application,
I have a place for the Fullscreen method.
[ Pause ]
So we see again very, very simple method.
I already have the button in the UI.
The buttons are already wired up,
so let's take a look at it.
So we see here now, we've able to enter Fullscreen mode
really, really easily, eliminated all distractions for user.
But the same time here now, we see how a
lot of our work today has come together.
We're now able to make the font sizes larger.
We're using color and the plus and the minus sign
to convey information quickly and to all users.
And we've generally made our software more
usable, more robust, and easier for everyone.
We've just made the software better
because there are more options to the user.
Someone now could set this on a second monitor
and just watch their portfolio all day long rather
than having to search through windows to look at it.
So, you're going to make your applications much better
and much more liked by our users because you're going
to eliminate some of those frustrations that
users often run into when using your application.
So, in summary today, we've talked about 4 groups.
We've talked about visual considerations,
auditory considerations,
physical considerations, and cognitive considerations.
For visual considerations, remember,
we want to keep in mind the resolution.
We want our application to be usable at lower resolutions.
Whee possible-- we want the font size of the key
content area to be adjustable by the end user.
We're going to make sure we keep in mind
colors that are used in our application,
never use color alone to convey information.
And lastly, we want to make sure that the
application is accessible to VoiceOver
by implementing the NSAccessibility protocol
on any custom classes and providing information
in Interface Builder for any standard Cocoa controls.
For auditory considerations, you want to make sure to
always provide information through multiple channels.
Never provide information through audio alone.
Always be aware that some users are using mono
audio, and you also want to make sure that any videos
that you're presenting have closed captions.
For physical considerations, you want to consider
users that aren't using the keyboard and mouse.
And to do this, you want to make sure that your
application is fully navigable using the keyboard alone.
Some tricks here are to use many
alternates and always make--
sorry, many shortcuts, and always make sure that
any mouse actions have a keyboard alternate.
Lastly, we have cognitive considerations.
These are considerations again how a user
is going to think when using your software.
You want to make your UI as simple as possible.
And to do this, you can use things like Fullscreen mode.
You want to also consider hiding more advanced to less used
UI by either contextual menus or making menu alternates.
So, if you have more questions, there's a ton of information
available regarding both accessibility and universal design.
I strongly recommend that you join
the Accessibility Mailing List.
It's a very well trafficked and friendly
mailing list for any of your questions.
There's also great documentation in which
you can get to via the WWDC website.
And Apple also has a really wonderful accessibility
web page which talks about accessibility
and accessible interfaces in all of our products.
It also provides you with links to
any documentation that you may need.
We also had some related sessions this week.
There's a session on iPhone accessibility
tomorrow afternoon and we have two labs.
Now, both of these labs are the ones
that says OS X and ones for the iPhone.
The entire team of engineers that work on
accessibility will be at both of these labs.
So, if you have any questions, whether they're iPhone or OS
X, please come to the labs and talk to any one of us.
We'll all be there.
And I'd like to thank you very
much for your time this morning.
It's been a pleasure talking to you.