10: Designed by a Programmer
00:00:00
◼
►
Welcome to Under the Radar, a show about independent app development.
00:00:03
◼
►
I'm Mark Arment.
00:00:04
◼
►
And I'm David Smith.
00:00:06
◼
►
Under the Radar is never longer than 30 minutes, so let's get started.
00:00:09
◼
►
This week we wanted to talk about how you can be, kind of like us, independent developers
00:00:14
◼
►
who work for yourself without having a full-time designer or trying to minimize how much of
00:00:20
◼
►
a designer's time you need.
00:00:23
◼
►
Because oftentimes people who are working for themselves can't afford a full-time designer
00:00:28
◼
►
or much design at all from other people.
00:00:31
◼
►
And sometimes even when you can afford it,
00:00:33
◼
►
if you're working on like a small app
00:00:35
◼
►
or you need to get something out quickly
00:00:37
◼
►
or you're not sure of the market of something,
00:00:39
◼
►
you often want to keep your expenses on that app very low.
00:00:42
◼
►
And it's often hard to justify having a full-time designer
00:00:47
◼
►
or having lots of hours from a contract designer
00:00:50
◼
►
helping you out there.
00:00:51
◼
►
So we kind of wanted to talk about the reality and process
00:00:54
◼
►
of being a programmer who kind of does your own design,
00:00:59
◼
►
and how that works out, and then other things later on
00:01:04
◼
►
about things like how you can do programmatic style assets
00:01:07
◼
►
versus static assets in your apps.
00:01:09
◼
►
So, David, what has your experience been
00:01:12
◼
►
with design for your apps?
00:01:15
◼
►
- So I do most of the core design of my apps myself,
00:01:22
◼
►
which is definitely-- it's a mixed bag in terms of what that ends up doing.
00:01:27
◼
►
But for the reasons you just outlined, it's a hard thing to hire a designer,
00:01:33
◼
►
especially, I find, at the first app, or the first version of the app,
00:01:37
◼
►
which is a little bit backwards in some ways.
00:01:39
◼
►
But for the way that I make apps, I don't know
00:01:43
◼
►
if the app I'm making is going to be worth putting a lot of time,
00:01:47
◼
►
and energy, and resources into.
00:01:48
◼
►
And so for a lot of my apps, the first version
00:01:50
◼
►
is just a couple weeks of work.
00:01:53
◼
►
And the concept of hiring a designer,
00:01:55
◼
►
even just the time overhead, the cost aside,
00:01:58
◼
►
if I could find a really inexpensive designer,
00:02:01
◼
►
the cost overhead in terms of time, of going back and forth,
00:02:04
◼
►
and getting everybody on the same page,
00:02:07
◼
►
and then waiting for the assets, and doing all that,
00:02:09
◼
►
it doesn't work as well for me.
00:02:10
◼
►
And so I tend to just sort of hope for the best
00:02:15
◼
►
and design things.
00:02:16
◼
►
And the result is maybe it's a bit mixed,
00:02:20
◼
►
But what I find though is at least once you have some experience designing apps, the core
00:02:27
◼
►
design questions, I guess this would be the UX design.
00:02:32
◼
►
I'm not really as familiar with the terms, all the different, like UI, UX.
00:02:34
◼
►
Please don't email us.
00:02:35
◼
►
And graphic design, maybe other three kinds of design, I don't know.
00:02:40
◼
►
Making an app that sort of works right and is functional and intuitive, that part I think
00:02:47
◼
►
I think I have a good handle on and I can make apps that do that.
00:02:50
◼
►
They just tend to not be pretty.
00:02:53
◼
►
And in general I found that people are pretty forgiving about things not being pretty.
00:02:57
◼
►
They'd rather it be functional, and so you can kind of get away with a lot more than
00:03:01
◼
►
you may otherwise have.
00:03:04
◼
►
And definitely this has been a lot easier since people don't expect apps to be pixel
00:03:07
◼
►
perfect anymore.
00:03:10
◼
►
There was a time when it was really hard if your app didn't have the crazy textures and
00:03:14
◼
►
everything is just aligned just so. Right now you're building an app that has to be
00:03:19
◼
►
4s size, iPhone 5 size, iPhone 6 size, iPhone 6+ size, then you have iPad, you have 1x iPad
00:03:31
◼
►
and 2x iPad, and iPad Pro. And so your design has to scale to everything anyway, and so
00:03:38
◼
►
you can get away with, I feel like in some ways, a lot more because you're trying to
00:03:42
◼
►
to design something more fluid anyway.
00:03:45
◼
►
- Like in some ways it's more like a web design, you know,
00:03:47
◼
►
now whereas before it was this very like texturally
00:03:51
◼
►
and graphically rich style in like the iOS 6
00:03:55
◼
►
and earlier days.
00:03:56
◼
►
And then since the iOS 7 style UI with, you know,
00:04:00
◼
►
all these clean flat colors and the thin text everywhere
00:04:04
◼
►
and lots of white space, I think it has shifted more
00:04:07
◼
►
into what web design kind of always was where, you know,
00:04:10
◼
►
because you have to design for so many screen sizes
00:04:14
◼
►
and be ready to adapt to new ones that might come out
00:04:16
◼
►
that we don't even know about yet,
00:04:18
◼
►
now you are kind of forced to make things simpler
00:04:21
◼
►
and more reliant on like text flow and stuff like that
00:04:24
◼
►
and less about like these giant baked-in images
00:04:28
◼
►
and also those are just out of style now,
00:04:29
◼
►
which has been such a huge benefit to people like us
00:04:34
◼
►
who don't have or can't afford full-time design help.
00:04:38
◼
►
It's been a huge boon for us.
00:04:41
◼
►
- Yeah, but I think of course it probably ends up
00:04:43
◼
►
with meaning that we become much more reliant on,
00:04:47
◼
►
I feel like there's a certain,
00:04:49
◼
►
and I don't really know where I learned these,
00:04:51
◼
►
and I think you actually have a better handle on these.
00:04:53
◼
►
Some people ask you, but like,
00:04:54
◼
►
there's certain, it seems like there's a certain basic set
00:04:57
◼
►
of like rules about layout,
00:05:00
◼
►
about how you structure like typography
00:05:04
◼
►
or the white space of a page
00:05:07
◼
►
and to make it look right.
00:05:08
◼
►
And when it isn't, at least at this point now,
00:05:12
◼
►
I have enough of a sense of it.
00:05:13
◼
►
I don't necessarily know why it's wrong,
00:05:15
◼
►
but I know it is wrong.
00:05:17
◼
►
And I pick that up just sort of as you go.
00:05:19
◼
►
But once you, it's more important in some ways
00:05:21
◼
►
because things aren't pixel perfect,
00:05:22
◼
►
that you just have these basic elements
00:05:25
◼
►
of good design under your belt.
00:05:27
◼
►
And this is something I noticed in all of your apps,
00:05:29
◼
►
as you've gone, it always seems to have
00:05:31
◼
►
that nice, clean, sharp look.
00:05:34
◼
►
Where do you think you learned to do that?
00:05:36
◼
►
Well, I mean, there's these different parts of design, right? So there's the graphical
00:05:42
◼
►
artistry part of it, and that's things like textures, things like designing rich icons,
00:05:48
◼
►
stuff like that. That part I have never been good at, and I probably never will be good
00:05:53
◼
►
at, and I'm okay with that. That part I'm happy to outsource and pay whatever it takes
00:05:59
◼
►
to get a great app icon made. If the textures ever come back in style, I hope they don't.
00:06:05
◼
►
they probably eventually will.
00:06:08
◼
►
And then I'll cross-site bridge when I come to it,
00:06:11
◼
►
'cause that will basically drive my costs up substantially.
00:06:16
◼
►
- It's all right, you can just have retro apps
00:06:17
◼
►
that are without texture, it'll just be retro,
00:06:20
◼
►
it'll be fine.
00:06:21
◼
►
- Yeah, it'll just become an affect rather than,
00:06:23
◼
►
this is what people do.
00:06:25
◼
►
But I think, so there's different parts of design,
00:06:29
◼
►
the graphical stuff I really can't do,
00:06:31
◼
►
but the rest of it, as you mentioned,
00:06:33
◼
►
like the rest of what you encounter in most app design, things like layout, basic text
00:06:39
◼
►
and typography, spacing, I've just kind of slowly developed my own sensibilities for
00:06:47
◼
►
that over time by starting some of it started in web design, but also just kind of paying
00:06:53
◼
►
attention and developing a feel for it over time, which is totally unhelpful. I recognize
00:06:59
◼
►
like, if you're listening and trying to figure, you know, trying to answer the question, like,
00:07:02
◼
►
how do I become familiar with the basics of design? Like, I don't know. I can't tell you
00:07:06
◼
►
that. There's probably some decent books about it that are made for this purpose. I'll try to
00:07:12
◼
►
find them and put them in the show notes if I can. But I just, I haven't gone that path. I've just
00:07:18
◼
►
kind of slowly developed a sensibility by just like kind of paying attention to designers and
00:07:23
◼
►
to design, even though I've never really been trained as a designer or considered myself one.
00:07:28
◼
►
done. And a lot of it is just like, you know it when you see it. When you lay something
00:07:33
◼
►
out in a way that is visually pleasing, you yourself will notice that this looks good
00:07:40
◼
►
in most cases, because you are also a person. You are also a user of this app. So you kind
00:07:47
◼
►
of play with it, following some basic principles. You can kind of play with it and work it out
00:07:52
◼
►
until it looks really good. But what you said is also correct. People are very forgiving
00:07:56
◼
►
of this. I mean, God help you if you ever look up screenshots of Instapaper 1.0. To
00:08:03
◼
►
some degree, in many cases, it doesn't matter as much as people think it does. Design is
00:08:09
◼
►
kind of like good marketing where it is really nice to have, if your app is going to become
00:08:17
◼
►
big and successful, you probably need good design. But you can get an app out there and
00:08:25
◼
►
and you can start building a market for yourself
00:08:27
◼
►
without having professional quality design,
00:08:29
◼
►
it is not like a strict requirement for success.
00:08:33
◼
►
And in many cases, in many markets,
00:08:37
◼
►
especially the more narrow the market gets,
00:08:39
◼
►
the more specialized or professional a market gets,
00:08:42
◼
►
the less design is valued or the less it matters.
00:08:46
◼
►
And so if you're making an app like,
00:08:48
◼
►
you know, for somebody to get their job done,
00:08:50
◼
►
and it basically needs like four buttons and a text field,
00:08:54
◼
►
then it doesn't really matter to a lot of,
00:08:58
◼
►
whether that's really pretty or not
00:08:59
◼
►
is probably not going to affect your success
00:09:01
◼
►
in that narrow market as much as it would
00:09:05
◼
►
in a mass consumer photography app, say.
00:09:08
◼
►
So it really depends on what you're making
00:09:10
◼
►
and how much this is worth.
00:09:11
◼
►
But ultimately, good design is something
00:09:13
◼
►
that if you can do it, you should do it.
00:09:15
◼
►
And if you can afford it, you should do it
00:09:18
◼
►
in almost every case.
00:09:19
◼
►
But that could be very expensive.
00:09:22
◼
►
I mean, hiring a professional designer could cost
00:09:26
◼
►
hundreds to thousands of dollars per day of their work,
00:09:30
◼
►
and it's really, it can be, it adds up so quickly.
00:09:34
◼
►
Just to get an app icon made,
00:09:37
◼
►
you can get an okay icon made for a few hundred dollars.
00:09:42
◼
►
To get a great icon made might cost a few thousand dollars.
00:09:45
◼
►
I mean, again, this is big money we're talking about
00:09:48
◼
►
for independent programmers,
00:09:50
◼
►
because most designers, most of their work
00:09:52
◼
►
comes from corporate clients.
00:09:54
◼
►
So you have to build in all these high prices.
00:09:57
◼
►
You have to account for how much of a pain
00:10:00
◼
►
corporate clients are to deal with,
00:10:01
◼
►
how much overhead you're going to have
00:10:03
◼
►
for every billable hour that you can actually get paid for.
00:10:06
◼
►
You have to account for all that
00:10:07
◼
►
and price things accordingly,
00:10:08
◼
►
whereas when you're an independent hiring designer,
00:10:12
◼
►
these prices are often out of reach.
00:10:14
◼
►
So it does help to familiarize yourself
00:10:17
◼
►
with the basics of design,
00:10:19
◼
►
or to hire a designer for the stuff that really matters,
00:10:22
◼
►
like your app icon and maybe like a once over
00:10:26
◼
►
of your main interface, but not to have somebody
00:10:29
◼
►
that you're like paying every single day
00:10:30
◼
►
or every single month ongoing.
00:10:33
◼
►
So it depends, and it depends a lot
00:10:34
◼
►
on the people you can find.
00:10:36
◼
►
If you can find a great designer who will take on your work
00:10:40
◼
►
for a price you can afford, great, that's awesome.
00:10:43
◼
►
But I have found that to be very difficult
00:10:45
◼
►
most of the time myself.
00:10:47
◼
►
- Yeah, 'cause I think the difficulty there
00:10:48
◼
►
Because it's the best designers are, if you're not paying them well, then they're
00:10:57
◼
►
kind of ripping them off.
00:10:59
◼
►
That's the nature of, if they really are that good, then they should be, in some ways,
00:11:05
◼
►
they should be well paid for their work, and doing that probably with clients who can do
00:11:13
◼
►
So you end up with a lot of small independent apps.
00:11:17
◼
►
The economics just don't tend to work out.
00:11:21
◼
►
And in some ways, you're probably better off.
00:11:24
◼
►
Rather than spending that money on that design, it's like training, buying yourself books,
00:11:32
◼
►
or spending the equivalent amount of time that you would have spent in money just trying
00:11:37
◼
►
to practice and get better at it yourself.
00:11:40
◼
►
Because that's certainly a skill that isn't going to go out of use or become useless to
00:11:46
◼
►
Once you have a stronger sense of design, that's only going to help your programming.
00:11:52
◼
►
That's never going to ever come back to you or bite you to be like, "Oh, no, now you
00:11:56
◼
►
know too much about design.
00:11:58
◼
►
Your apps are getting worse."
00:12:00
◼
►
It's a good thing to invest in.
00:12:01
◼
►
If you can afford it, great.
00:12:05
◼
►
My guess is you're probably then either working for a bigger company or just somehow very
00:12:11
◼
►
wealthy, I suppose.
00:12:12
◼
►
Yeah, I mean, you can look at it also as like, can you afford any other kind of staffing
00:12:17
◼
►
Like, if you can afford to pay other programmers to be with you to help make bigger and more
00:12:22
◼
►
complex apps, then the cost of a designer relative to other programmers is very reasonable.
00:12:28
◼
►
But if the idea of paying another programmer to help you out is completely out of reach
00:12:33
◼
►
because the economics aren't working out, it's probably also going to be challenging
00:12:36
◼
►
to pay a designer.
00:12:39
◼
►
Anyway, in much less expensive news, we are sponsored this week by Hover. Hover is, quite
00:12:45
◼
►
simply, the best way to buy and manage domain names, and it costs way less than hiring a
00:12:50
◼
►
full-time programmer or designer. Now, when you have an idea for a project, naming it
00:12:54
◼
►
can be difficult. Once you finally get that name, you want to be able to quickly and easily
00:12:58
◼
►
get the domains you need. Hover provides a simple, fast, and hassle-free method of buying
00:13:02
◼
►
domain names. It is very easy to search for new domains, search for domains that are available,
00:13:07
◼
►
you enter the phrase you want or some keywords if you don't know an exact name and they will
00:13:10
◼
►
find available matches for you and show you a list of all the crazy new TLDs that are
00:13:15
◼
►
available with that name. They have of course you know the nice old ones dot com, dot net
00:13:19
◼
►
and all that stuff but they also have all the crazy new ones dot plumbing, dot coffee,
00:13:24
◼
►
dot sexy if you go that way. All these TLDs they have recently lowered their prices on
00:13:28
◼
►
pretty much all of them. So dot com domains are now just $12.99 a year and all this includes
00:13:34
◼
►
free whois privacy for all their domains. They believe that you should not have to pay
00:13:38
◼
►
extra to keep your private information private. And they have fantastic customer support if
00:13:43
◼
►
you ever need it. Hover offers a no hold, no wait, no transfer telephone support policy.
00:13:48
◼
►
They are famous for this and there's a good reason why. When you call them, you talk to
00:13:51
◼
►
an actual human being. There's no robots, no menus, but if you do prefer robotic communication,
00:13:56
◼
►
They also have great support documents and guides
00:13:58
◼
►
on their website for getting everything you need
00:13:59
◼
►
as well as email support if you need that.
00:14:02
◼
►
And don't forget their Hover valet service,
00:14:04
◼
►
where if you want, if you have a bunch of domains
00:14:06
◼
►
somewhere else, or even just one,
00:14:09
◼
►
any number of domains you have somewhere else,
00:14:10
◼
►
you wanna transfer them over to Hover,
00:14:12
◼
►
they will, if you want, do the whole transfer for you.
00:14:15
◼
►
Because I've never met anybody who said,
00:14:17
◼
►
"You know what I love doing?
00:14:18
◼
►
"Domain name registration transfers."
00:14:19
◼
►
No, not a single person ever wants to do that.
00:14:22
◼
►
Hover will do it for you if you want.
00:14:23
◼
►
It's fantastic, there's so much great stuff at Hover.
00:14:26
◼
►
Check it out today, go to hover.com to try them out,
00:14:28
◼
►
use code Swift at checkout,
00:14:31
◼
►
and you will get 10% off your first purchase at hover.com,
00:14:34
◼
►
and show your support for Under the Radar
00:14:35
◼
►
and all of Relay FM.
00:14:36
◼
►
Thank you so much to Hover,
00:14:38
◼
►
use code Swift to check out for 10% off,
00:14:40
◼
►
thank you so much for sponsoring this episode.
00:14:43
◼
►
- All right, so I think the next thing
00:14:44
◼
►
that we wanted to dive into a little bit
00:14:47
◼
►
is something that I know, I think,
00:14:50
◼
►
I've heard you talk a lot about this,
00:14:52
◼
►
and it's something that I know I've started doing
00:14:53
◼
►
a lot more in my own apps,
00:14:54
◼
►
is once you have your design--
00:14:57
◼
►
and this is especially for the graphical assets in your app,
00:15:00
◼
►
so button icons or images of any kind--
00:15:06
◼
►
you can either pre-render that image,
00:15:08
◼
►
so have it come out of Photoshop or Illustrator
00:15:11
◼
►
or whatever design tool, Sketch, whatever it is that you're
00:15:14
◼
►
using, render it out as a PNG, put that PNG--
00:15:17
◼
►
well, I will put all three of the PNGs,
00:15:18
◼
►
like the 1x, the 2x, the 3x version of that asset,
00:15:22
◼
►
add it to your project and bundle it in that way, or you can programmatically generate
00:15:28
◼
►
it, either as like in the draw rect of a UI view or generating an image that you put in
00:15:34
◼
►
a UI as you turn into a UI image. And I know I think we've both been on the path towards
00:15:42
◼
►
less and less static assets and more and more programmatic assets. And so it's probably
00:15:47
◼
►
something that's worth talking about some of the reasons why we do that.
00:15:51
◼
►
Oh yeah, I mean like for me, static assets are a liability for future work because anything,
00:15:57
◼
►
any kind of image, like, you know, suppose I hire a designer to make like toolbar icons
00:16:02
◼
►
in my app, which I've done before and it's often worth doing. So I have these toolbar
00:16:06
◼
►
icons and then Apple comes out and says, "Oh, by the way, you know, there's going to be
00:16:10
◼
►
a new iPad resolution, it's now going to be iPad at 3x." Then you need new versions
00:16:15
◼
►
to those icons that can be rendered at 3x. You can attempt to do it yourself, but generally
00:16:21
◼
►
you won't have like a source vector file. You will have like a stack of PNGs that the
00:16:27
◼
►
designer gave you when you paid them two years ago. And so you can try to make it or resize
00:16:33
◼
►
it yourself, it'll probably look bad. You probably shouldn't do that. So oftentimes
00:16:37
◼
►
you have to then go back to the designer and pay for even more of their time for them to
00:16:41
◼
►
do something that's really very trivial that they probably don't even want to do because
00:16:44
◼
►
That's pretty uninteresting work. Dig up old files and re-render something out as a different
00:16:49
◼
►
resolution and everything. So it's this kind of clunky procedure that, if you rely on graphical
00:16:56
◼
►
assets that are baked into static images, you have all this liability whenever the technology
00:17:02
◼
►
changes under you. Or if you just want to tweak the design. Like, what if you want to
00:17:05
◼
►
make all the line widths half a pixel narrower in the next version, in the next design? That
00:17:12
◼
►
becomes very difficult if you just have a bunch of images and you have to re-render
00:17:16
◼
►
all those assets out.
00:17:18
◼
►
On the other hand, if you have all those images and stuff, there's a lot of upsides to that.
00:17:23
◼
►
Your app, first of all, will load faster because you won't have to be drawing these things
00:17:30
◼
►
Certain art styles are only really possible in static images and become pretty impractical
00:17:35
◼
►
to impossible to recreate with like quartz drawing commands in a draw-rect function.
00:17:42
◼
►
So there are definitely advantages and disadvantages. Generally speaking, programmatically generated
00:17:48
◼
►
images make your app bundle very small. This is one of the reasons why Overcast is only
00:17:51
◼
►
something like 7 megs. It's a very, very small app bundle because I have almost no images
00:17:55
◼
►
in it. Almost everything in Overcast is generated procedurally. So it makes your app bundle
00:18:00
◼
►
very small, it makes it very easy to adapt to new devices and new sizes, but static images
00:18:07
◼
►
almost certainly will load faster. There's also the OS will cache them, any kind of UI
00:18:13
◼
►
image, image named call, those kind of things that cache, the GPU will cache certain things,
00:18:17
◼
►
the frameworks will cache certain things. Generally speaking, for speed of operation,
00:18:23
◼
►
you want static images, but for ease of programmer work,
00:18:28
◼
►
programmatically generated stuff can be a lot easier.
00:18:32
◼
►
- And I think the biggest thing too is with programmatic,
00:18:35
◼
►
there's even like probably just the philosophy of it,
00:18:40
◼
►
of making sure that, like what you're saying,
00:18:42
◼
►
the biggest thing that I think you're pointing out is
00:18:44
◼
►
if your art assets need to be, or are ideally in some format
00:18:51
◼
►
that you're going to be able to scale and adjust and re-render later, at the very least.
00:18:59
◼
►
If you are using a completely, like, if you have a designer, or even if you're in with
00:19:03
◼
►
yourself, like if you're going to, if you're building things in such a way that you cannot
00:19:09
◼
►
just easily scale them up and down, like, keeping them, you know, having vector artwork
00:19:13
◼
►
in Photoshop or Illustrator or Sketch, or doing it in some way like that, that you can
00:19:18
◼
►
scale up and down, it's a ticking time bomb for at some point you're going to need something
00:19:25
◼
►
Like, there was a time when we just had one X everywhere, and then there was two X and
00:19:29
◼
►
one X, and then now there's three X as well, and it's always going to change.
00:19:35
◼
►
Everything like, one of the few, I don't know if we'll ever get to four X, but something
00:19:41
◼
►
else is going to happen.
00:19:42
◼
►
Like, all of a sudden, for a long time I think I had the thought that the iPad was always
00:19:46
◼
►
going to be 1024x768 in terms of functional size.
00:19:51
◼
►
And it's like, no, it turns out they're going to—because when they went to the MIDI, they
00:19:53
◼
►
kept the same resolution, they just smushed it a bit.
00:19:56
◼
►
And with the Pro, though, it's like, oh no, here's this massive new screen.
00:20:00
◼
►
And so the most important thing is to be able to, over time, have those assets be dynamic
00:20:09
◼
►
and to change over time, whether that's rendered in your app, which like you were saying, sometimes
00:20:13
◼
►
Sometimes that's good, sometimes it's bad, like it's some trade-offs, but whatever form
00:20:17
◼
►
you're doing it in, it needs to be something that you can very easily, if all of a sudden
00:20:22
◼
►
it's like, "I need them at a different size," even if it's not a different resolution, even
00:20:25
◼
►
if it's just like, "You know, I think the alignment on this isn't quite right.
00:20:29
◼
►
I need to make it a bit smaller."
00:20:31
◼
►
Being able to re-render that from source rather than taking the image and resizing it, which
00:20:38
◼
►
is never going to look good.
00:20:40
◼
►
you need to be able to say, "Let's re-render this from the beginning in the exact dimensions
00:20:45
◼
►
that I want it to be." And if you can do that, then your workflow is good. If you can't,
00:20:52
◼
►
then you probably need to fix it, because you're just waiting for it at some point down
00:20:56
◼
►
the road to come back and bite you.
00:20:57
◼
►
Yeah, and even there's a hybrid approach you can do here, which I've employed for all my
00:21:03
◼
►
watch assets. In some contexts in the OS or in the frameworks, in some contexts you can't
00:21:09
◼
►
do a programmatic rendering of something. You have to have an image in the app bundle
00:21:14
◼
►
with a certain name. So things like your launch icons, like your app icon just can't be programmatic
00:21:20
◼
►
in iOS today. Other things like in WatchKit, in WatchOS 2 I would imagine it's more flexible,
00:21:27
◼
►
but in WatchKit, WatchKit 1, many things had to be static images. There were certain things
00:21:35
◼
►
>>Erik: Everything had to be static images.
00:21:36
◼
►
- Everything, right.
00:21:38
◼
►
And so with Overcast, what I did,
00:21:40
◼
►
I have my themed buttons that are in the app,
00:21:44
◼
►
and those buttons are all generated by just calls
00:21:47
◼
►
to one of my appearance manager functions
00:21:50
◼
►
in my custom appearance class,
00:21:52
◼
►
and you just specify what size canvas
00:21:56
◼
►
to render this icon into,
00:21:58
◼
►
and the line width and the color,
00:22:01
◼
►
and some of them will display things,
00:22:03
◼
►
like the seek buttons that have the number of seconds
00:22:06
◼
►
inside of them that will be seeked, sought, whatever it is.
00:22:09
◼
►
Like that's all customizable by the user
00:22:13
◼
►
and so like those buttons just,
00:22:14
◼
►
you know like there's a function that just says
00:22:16
◼
►
render seek button at this size with this color,
00:22:19
◼
►
this line width and with this number in the middle.
00:22:22
◼
►
And the function has a text drawing call
00:22:23
◼
►
and it went in the middle of all these shapes
00:22:25
◼
►
and by the way Paint Code is a great app
00:22:27
◼
►
for generating the code for any kind of non-trivial shape.
00:22:31
◼
►
Recommend that.
00:22:32
◼
►
But then, you know, and then it just wraps it
00:22:34
◼
►
in like an image context where it just
00:22:35
◼
►
does a transform that scales it.
00:22:37
◼
►
So I can render this image that the source is in a 100 by 100
00:22:42
◼
►
grid or whatever I set paint code to,
00:22:44
◼
►
and then just scales that with CG code to whatever output
00:22:49
◼
►
size you wanted it at.
00:22:51
◼
►
And so when you have a context like WatchKit
00:22:54
◼
►
where you're required to have static images,
00:22:57
◼
►
I have a special build mode that I can set the app in where it
00:23:00
◼
►
just generates those for me in every configuration
00:23:03
◼
►
that it might ever need with my current code.
00:23:06
◼
►
So it literally just calls that function
00:23:08
◼
►
and renders out static assets
00:23:10
◼
►
that I can then include in the app bundle.
00:23:13
◼
►
So that kind of hybrid approach, I think,
00:23:15
◼
►
has a lot of advantages.
00:23:16
◼
►
It is more complex.
00:23:17
◼
►
It will not save any space in your app bundle,
00:23:20
◼
►
but it will allow you to use these images
00:23:23
◼
►
in calls like ImageNamed and in context
00:23:27
◼
►
where you need static images,
00:23:28
◼
►
and it preserves all the load time optimizations,
00:23:32
◼
►
the caching optimization on the platform.
00:23:34
◼
►
So the hybrid approach I think is worth considering.
00:23:37
◼
►
But ultimately, I love doing things programmatically
00:23:40
◼
►
because I think you're right,
00:23:41
◼
►
it feels more semantically right.
00:23:44
◼
►
If I have a graphic that is just like,
00:23:47
◼
►
a circle with an arrow going into it,
00:23:50
◼
►
why does it need to be a bitmap file somewhere?
00:23:52
◼
►
Why can't that just be represented as vectors?
00:23:55
◼
►
It seems as a programmer,
00:23:57
◼
►
and I recognize this isn't how design works,
00:23:59
◼
►
but it seems as a programmer,
00:24:01
◼
►
that is the most correct way to represent that, is by vectors. And this isn't true
00:24:06
◼
►
for everything, of course, but so much of what we do today and the current styles of
00:24:11
◼
►
interfaces, that is true for. And it just feels right. It feels right to represent it
00:24:16
◼
►
as a function. And even in many ways, like I mentioned in my scaling technique earlier
00:24:21
◼
►
with these function calls, a lot of times something really simple like drawing an X,
00:24:27
◼
►
an icon that's just like a big X or a plus sign. I would like I render that in a 1.0
00:24:33
◼
►
scale graph like it's you know one by one and it's like all right, draw a line from
00:24:37
◼
►
0.5 to 0.5 you know like and then just render that to any size like that that is actually
00:24:42
◼
►
easier and simpler to write and to conceptualize than having 16 different PNG files that have
00:24:50
◼
►
different thicknesses and everything and sometimes you need the dynamism you know if you offer
00:24:55
◼
►
for things like if the icon has to be rendered
00:24:59
◼
►
at different colors, different fonts
00:25:01
◼
►
for any kind of embedded text, different line thicknesses,
00:25:04
◼
►
or if it's something that's being reflected in the UI
00:25:07
◼
►
that is some kind of dynamic element,
00:25:09
◼
►
like if you have some kind of UI widget
00:25:12
◼
►
where you're showing progress.
00:25:14
◼
►
Do you actually wanna render out a progress bar
00:25:17
◼
►
at 100 different widths for all the different percentages,
00:25:21
◼
►
or do you, which I actually did for my watch app,
00:25:25
◼
►
Or do you want to just have one that you can call a function
00:25:30
◼
►
and you can generate it at whatever value you need?
00:25:33
◼
►
So in a different, there's obviously different needs here
00:25:35
◼
►
in different situations.
00:25:36
◼
►
Usually I prefer to go programmatic wherever possible
00:25:40
◼
►
for my image generation because usually the downsides
00:25:44
◼
►
are either non-existent or very, very small
00:25:46
◼
►
and the upsides are quite big.
00:25:48
◼
►
- And I think too, one thing that I like about,
00:25:51
◼
►
more I've gotten into doing programmatic rendering is it keeps my, it matches well with my ability.
00:26:00
◼
►
So if I open Photoshop, which I don't really have that much business getting into, but
00:26:05
◼
►
I can do a lot of stuff there that probably ultimately doesn't look very good. Like I
00:26:12
◼
►
can overdesign and try and be clever than I actually am. Whereas when I'm writing it,
00:26:19
◼
►
even in paint code or just like in core graphics calls like it limits and constrains me in
00:26:25
◼
►
a but I find to be a positive way that like I understand core graphics in a way that I
00:26:30
◼
►
don't understand Photoshop. And so it's constructive for me to like, okay, I can only do like 10
00:26:38
◼
►
drawing operations or whatever it is like you can do in core graphics like functionally,
00:26:41
◼
►
it's like you can stroke a path, you can fill a shape, like there's a few basic things.
00:26:46
◼
►
And so if I make my art assets align with that, I'm probably not gonna reach beyond
00:26:52
◼
►
what I'm actually capable of doing.
00:26:54
◼
►
Or as if I go into Photoshop and like, "Oh, I can do layer styles.
00:26:57
◼
►
Ooh, that's pretty.
00:26:58
◼
►
Ooh, let me go into this here.
00:26:59
◼
►
Oh, I can blur this over here."
00:27:00
◼
►
Like doing stuff that I have no business doing.
00:27:04
◼
►
And so at least if I keep it as programmatic and simple, then I'm not exceeding that.
00:27:09
◼
►
And I understand it too.
00:27:11
◼
►
Like that's maybe another part of it.
00:27:12
◼
►
Like we're saying from the beginning of like,
00:27:14
◼
►
if you're doing this all yourself,
00:27:16
◼
►
like it's one of the dangerous things too in some ways
00:27:19
◼
►
is if you're an external designer
00:27:23
◼
►
is making something for you,
00:27:25
◼
►
that you have no way then of recreating.
00:27:27
◼
►
- Or adjusting.
00:27:28
◼
►
- Or adjusting or tweaking.
00:27:29
◼
►
Like I don't understand it, then I can't change it really.
00:27:34
◼
►
And that's just, has definitely come back
00:27:37
◼
►
to bite me a few times where I just need
00:27:40
◼
►
change something slightly and I can't because it's a baked PNG and so it's like I just have
00:27:45
◼
►
to make do or I need to try and get back on my designer schedule to make a really minor
00:27:50
◼
►
adjustment for them and work out the contracting for that.
00:27:53
◼
►
If it's nice and easy and understandable, it's probably going to be better down the
00:27:58
◼
►
road and I think so for me, this is where I'm heading.
00:28:01
◼
►
I do very few static images anymore.
00:28:05
◼
►
I tend to do a lot more programmatic things,
00:28:08
◼
►
or at least storing my assets in a form
00:28:11
◼
►
that I can easily re-render and regenerate.
00:28:14
◼
►
And I can look at it and I'm like, yep,
00:28:16
◼
►
I understand what that's doing.
00:28:17
◼
►
I see the lines it's drawing, the shapes it's filling,
00:28:19
◼
►
and that makes sense to me.
00:28:21
◼
►
- Yeah, and the result of that usually isn't as good
00:28:26
◼
►
as what you can get with a pro designer,
00:28:27
◼
►
but it's one of those things where you can get
00:28:32
◼
►
two thirds of the way there for a lot less cost
00:28:36
◼
►
and with a lot of other benefits.
00:28:38
◼
►
So that isn't always worth it, sometimes it is.
00:28:41
◼
►
And sometimes you don't have a choice.
00:28:43
◼
►
So it's nice to be able to do the minimum required
00:28:48
◼
►
with the resources you have rather than being forced
00:28:52
◼
►
to go and spend a lot of money you don't have.
00:28:54
◼
►
So it's good to have this option.
00:28:58
◼
►
- All right, I think that wraps it up for this week.
00:29:00
◼
►
Thanks a lot to our sponsor this week,
00:29:01
◼
►
Thanks a lot for all our listeners.
00:29:03
◼
►
Please recommend us to friends and rate us on Overcast
00:29:05
◼
►
and iTunes and everything and we will see you next week.