Hipmunk on Daring Fireball
It’s no exaggeration to say I’ve been trying to get my work on Daring Fireball since I started my iPhone development and user experience adventures three years ago. Thrilled to see it finally go down:
…[T]heir custom date picker is simply brilliant. Hipmunk has a good web interface too, but it has nothing on the iPhone interface. This is why native apps matter.
Thanks for the love, John!
I’m especially pleased he calls out the date picker. That was a lot of work to get right and it’s not the sort of thing you can get away with being wrong in something like flight search and still have happy users.
Memories of System 7.5
Almost everything good that has ever happened in my life can be traced back to my early experience with a Mac. The first family computer that ever lived in my house was a Performa 6116CD. 
I absolutely loved that thing, especially by contrast with the rest of my life. School was typically dull: I spent very little time learning about anything that was important to me. I think I could count the number of friends I had with half of one hand – and they were certainly outnumbered by people who disliked me but couldn’t find constructive ways to express those feelings. My home life was no picnic, either.
Yet none of that mattered when I was at the keyboard of my Mac. It was, all at once, a second school, a conduit to another world, an infinitely deep toolbox and a magic wand of indescribable power – running at 60 MHz.
I thought it would be fun to venture down memory lane and revisit my Mac of 1995. Of course, the hardware itself is long gone. But through the magic of Sheepshaver, I’ve been cobbling together the scraps of my favorite childhood memories. Other kids had sports, comic books or Jesus. But the thing I believed in was my Mac.
System 7.5
My childhood experience with the Mac spanned System 6 through Mac OS X 10.2 but System 7.5 was easily the golden age. That would be the first time I had long-term access to a machine I could customize any way I wanted.
Once installed in Sheepshaver, even through an emulated PowerPC processor, System 7.5 is extremely performant compared to 16 years ago. On a Late 2010 MacBook Pro, loading from an SSD, boot time is about two seconds, compared to about 30 seconds in 1995.
The cheerful parade of Extensions and Control Panels marches at the bottom edge of the screen. Performance be damned, I loved collecting these.
Of course, the System 7.5 era was extremely long – an interminable wait for Copland, the next generation operating system that would make unicorns fly from your 4x CD-ROM drive. As time went on, the UI started to look pretty stale.
So it’s important to install one of my favorite extensions from the period, called Aaron, to spruce things up a little:
That’s better. Aaron adds a little flair and dimension to the otherwise flat and bland System 7-era UI and I liked it a lot better. Even at 10, I was starting to be curious about the nuances in UI design.
AOL
AOL was my very first taste of the internet. I believe our first bill came out to $80. So that didn’t last long. Luckily, their unlimited dialup service showed up about a year later, so I would be back in action. Sadly, but unsurprisingly, you can’t actually use the AOL client anymore. Still, I got to poke around with the modem configuration panel that was a frequent source of frustration once upon a time.
ClarisWorks
This little suite was bundled with the Performa. Very little to be excited about here but I spent so many hours cranking out school reports and other projects in its Word Processing, Paint and Vector Art modules.
Hotline
The gravest of my youthful indiscretions was easily my voracious appetite for pirated software. Enter Hotline. Before Napster, before Gnutella, before BitTorrent, there was Hotline. Hotline let anyone set up a file server on their home computer. It included chat, BBS and persistent user accounts, too. Vibrant communities sprung up around these little amateur servers. They dedicated themselves to everything from religious evangelism to technical support to sharing anarchist/conspiracy text files. Of course, being the internet, there would be plenty of pirated software in the mix.
To my utter delight, the mid-90′s version of Hotline I got started with so many years ago not only still works, there’s even a handful of servers still in operation. Back then, I was lucky to pull down files at 2.8 KB/sec via dialup. A limitation of either Sheepshaver or Open Transport, the aged TCP/IP stack Hotline uses, now caps me at 60 KB/sec, but that’s a big improvement I’d have killed for as a kid.
Hotline is a major hinge in my history. With access to so much software, I dedicated myself to learning how to use it. I rarely had access to any documentation beyond what was built into the apps so it was often an exercise in trial and error. It was also fun beyond words.
This began my life-long study of interfaces and user experience. If this hadn’t happened, I have absolutely no idea what I’d be doing with my life right now.
Photoshop
Hotline could be extended with customized icon sets. If one of the two dozen included user icons didn’t strike your fancy, you could create your own. The trouble was that only other users with your custom icon file could see your handiwork.
Of the thousands of active Hotline servers in operation during its golden age, two emerged as dominant tribes vying for the loyalty and patronage of the masses. Known as BadMoon and SoSueMe, the servers collected thousands of customized user icons and then distributed them as authoritative custom icon sets.
Of course, I wanted to get in on this. ClarisWorks’s Paint module really wasn’t up to the task, so I had to find and learn Photoshop 3.0. This little head-start on graphics tools ended up being important – years later, I’d be able to design my own UI elements thanks to this early noodling.
It meant days of downloading but it was worth it.
One striking thing about Photoshop 3.0 is how very little has changed after all this time. The color picker is identical. There are the many cluttery pallets for layers, brush diameter, colors, and channels. Later versions would introduce layer styles, which were awesome but a little rigid, and endless other bits of junk. The overall workflow, aside from crappy Save For Web, remains much the same. (This is why I now use Opacity to design UI – it’s built for how I actually work.)
ResEdit
I loved ResEdit when I was a kid. Apple’s resource editor let you poke your nose into most system files and applications, revealing image assets, icons, interface elements and plenty of other technical goodies I didn’t really grok at the time. It was surprisingly deep, including a little MacPaint-like editor for the icon files along with a drag-and-drop interface editor. At the instigation of David Pogue and Joseph Schorr, I recall using it to make the bloated trash can look filthy and overflowing.
Gaming
No exploration of Mac history would be complete without a look at some of the platform’s greater gems of gaming. PC’s may have had more games by volume but the Mac didn’t have any shortage of fun, either.
Escape Velocity
I sunk so many hours into EV, it’s not even funny. A nerd who grew up on Star Trek and other scifi, I found this game’s premise of space exploration, commodity trading, secret missions and interstellar combat extremely compelling. Entire Saturdays vanished into its gaping maw.
Marathon 2
Before Halo, Bungie made Marathon. It was a rich story of treachery and tragedy among the stars. Crazy AIs and three-eye aliens all trying to get you killed while you blast things with enormous guns. No full-motion video cinematics here, though. If you wanted story, you had to read.
SimCity 2000
I was terrible at SimCity. My budget rarely balanced, my people always complained.
I loved it anyway. SimCity 2000 is still surprisingly playable, too. Definitely a timeless piece of work.
End of an Era
The way many expected the System 7.5 era to end was pretty bleak: Apple collapses, the Mac dies, and its software and hardware begin to decay into uselessness.
Of course, history went a different way. I’m glad that Apple survived long enough to ship Mac OS 7.6 and OS 8, that in the time since Apple has rebuilt itself into the juggernaut of its industry. Mac OS X beats the hell out of anything that came before it. I still remember picking up my copy of Macworld at the supermarket and learning how Apple bought NeXT – and hoping that the future would bring brighter days for everyone’s favorite “beleaguered” company. And it did.
Still, I’ll always look back with fondness on those days of innocence before a Unix shell was a keystroke away, before every UI interaction was beautifully animated, before we measured even the tiniest of hard drives in gigabytes, before collaborative multi-tasking and protected memory. When using the computer was new and exhilarating. When the Mac was more than just tool – when it was an escape to another realm of existence. Those were the days when a little boy, without coming anywhere close to realizing it, laid the groundwork for all the wonderfully fun things he’d get to do years later as a man. I learned way more from my Mac than school ever gave me.
Thanks for the memories, Apple.
iPhone Development: Force UITableView to show only complete cells
Tallymander uses UITableViewCells not only to display data but also to manipulate it. That means that partially-visible cells — that is, those that are cut off at the top or bottom of the view — aren’t terribly useful.
Better, I thought, would be to always ensure that when a partially-visible cell crops up, the UITableViewController will quietly nudge things to be completely visible.
In the first image, you can see the only part of the top and bottom cell. In the second image, the cells have been nudged so that everything visible is completely visible. This took a little noodling around with math but it wasn’t hard to do. Put this method into your UITableViewController subclass:
- (void)snapBottomCell { NSInteger cellHeight = 62; //Cells for my view are 62px tall. Sub your own height here NSInteger offsetOverage = (NSInteger) self.tableView.contentOffset.y % cellHeight; //Use the tableview's contentOffset property and the cell height to determine how much is being cut off if (offsetOverage > 0) { //If the overage is more than 0, we should figure out what the new offset needs to be NSInteger newOffset; if (offsetOverage >= (cellHeight/2)) { newOffset = self.tableView.contentOffset.y + (cellHeight - offsetOverage); //If the overage is greater than or equal to half the height of a cell, pull the cell up so it's fully visible } else { newOffset = self.tableView.contentOffset.y - offsetOverage; //Else, push the cell out of view } //With the new offset determined, animate the movement: [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; [self.tableView setContentOffset:CGPointMake(0, newOffset) animated:NO]; [UIView commitAnimations]; } }
You’ll need to implement these two delegate methods as well:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self snapBottomCell]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (decelerate == NO) { [self snapBottomCell]; } }
And that’s it. If more than half of the bottom cell is visible, the cell gets nudged completely into view. If less than half is visible, it’s pushed out of view.
You could change snapBottomCell to accept cellHeight as an argument if you need to accommodate cells with variable heights. You might sort out a particular cell’s height like so:
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:CGPointMake(0, (self.tableView.frame.size.height - 1))]; //Get the index path of the cell currently visible at the bottom edge of the tableview UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [self snapBottomCell:cell.frame.size.height];
There are cases where this isn’t useful: long lists whose primary function is selecting data for loading in another view, for example. Still, any time you’re using UITableViewCells to house controls or chunky bits of data, it might be good to ensure that only whole cells are displayed.
Tallymander 2.0 Post-Mortem
Tallymander 2.0 has been in the App Store for a few weeks. Here’s the story on my favorite product, so far.
Once upon a time…
Tallymander was born because once upon a time, I worked for the man and that meant wearing fancy pants and shirts that buttoned (the better to establish my image as a professional and advance my career). About once a month I rounded up my finery, counted it, and took it to the dry cleaners.
My mental math abilities could be bested by a fruit fly so I wondered if the App Store had anything to make the counting easier. They did, but it was either crap or too limited for my needs. The idea for Tallymander was born. I wanted to make something simple but useful.
I expected to make about $40 off of it, but I knew I wanted the challenge so I plowed ahead anyway. 1.0 shipped and people liked it. Really liked it! I got a handful of emails with kudos and feature requests. I wanted to get cracking on GlobeJot but decided I would spend a little time adding some customer requests to Tallymander first. A couple more weeks of development and Tallymander 1.1 was submitted. I forgot all about it.
Until one night, around midnight, when I got the “Ready for Sale” email that iPhone developers live for. Tallymander 1.1 was live.
And an App Store Staff Favorite. I peed myself a little. There followed a slew of copycat apps following this prominence. So it goes on the App Store.
The future
Tthanks to a handful of enthusiastic users and a little help from Apple, Tallymander managed to make me a tidy bit more money than the $40 I had expected. About $4,000 to date, in fact. Not bad for an app that started as a two week UX trial.
Lots of Tally Counters

Since Tallymander was made a Staff Favorite last month, I’ve noticed that there are more solutions to the tally problem in the App Store than when I began.
There are, of course, many ways to skin a cat. For me, Tallymander does the job best because I built it to my exact desires. Still, while many elements of design are subjective, there are good and bad ways to do things. Let’s look at some of the other approaches to the tally challenge.
Tally Max

A few things jump right out:
Inefficient use of space: The entire width of the iPhone’s screen is available to each tally cell, but the tally title is confined to a much more limited area. The title is the only element that the user can customize beyond the rails of your design — give it some room. More…








