Technical Notes on Vesper for iOS 7
(Vesper for iOS 7 is on the App Store.)
You remember in Lord of the Rings when Gollum finally gets the ring and he’s holding it up and dancing around? That’s me and TextKit.
So happy together.
Vesper’s detail view — with separate fonts for title and text — was barely possible in iOS 6. Dealing with changes in formatting meant replacing the
attributedText and restoring the selection.
But TextKit changed that. You can change the formatting attributes of part or all of the
attributedText without replacing the
attributedText. Way better.
There’s a bunch more to TextKit — but just that one thing was huge for Vesper.
I didn’t, by the way, end up using TextKit for the notes list. We already had working code that used Core Text, and there was no reason to change that code, so we didn’t.
While I love TextKit, I didn’t love
UITextView that much. There are new bugs, and we couldn’t work around all of them. But
UITextView in iOS 7 is really a 1.0 release, and so I forgive it. (I need to file some Radars.)
It took just a few minutes. I bet that’s true for most apps, though games might be an exception. (I don’t know much about games; I could be wrong.)
Since I’d been through this same transition on the Mac, I was already careful to always use NSInteger, CGFloat, and friends.
The compiler caught all the places I needed to make changes. (I use Hosey-level warnings.)
There were a bunch of places I used
ceilf and I needed to use
ceil for 64-bit processors, since CGFloats are doubles on 64-bit. The other cases were similar (
fabs). (I use
ceil a bunch in layout code because I want to make sure view frames use integral values, and some things like text measurement return non-integral sizes.)
There are a two places where we use
UIToolbar: in the detail view and in the web browser view. I like that the new
UIToolbar is translucent, with a live-blurred background.
But I treat
UIToolbar like any other view. In the past I’ve found that it’s difficult to precisely control the location and tap target size of buttons inside a
UIToolbar, so now I just add buttons as subviews. I don’t particularly like doing that, but it works.
Vesper doesn’t use a
UINavigationController, so we don’t get the automatic pan-to-go-back gesture. Apple provided a new gesture recognizer —
UIScreenEdgePanGestureRecognizer — that allows us to handle pan-to-go-back ourselves. It’s a subclass of
UIPanGestureRecognizer, as you’d expect. Easy to use.
We don’t, by the way, use
UISwipeGestureRecognizer anywhere. This is because a swipe is just a gesture, while pans are direct manipulation.
My favorite new small thing
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;
Things I Didn’t Use (or didn’t use much)
iOS 7’s dynamic text feature is very cool — but it doesn’t support fonts other than the system font. We added a Typography screen to Vesper, so that you could change the font size and weight in the app (and even use small caps for titles).
The API for dynamic text returns a
UIFont. I could have just grabbed the font size and used that with our custom font. But that would have been a hack, and it felt like we were solving a problem that’s really Apple’s problem to solve.
(I can see why dynamic text supports only the system font. But for apps that use custom fonts, it would still be useful to be able to get the user’s preferred font size.)
Dynamics and Motion Effects
It seems like Vesper is exactly the kind of app that should use dynamics and motion effects, and I certainly plan to in the future. But I already had working code to do the things we wanted to do, and there was no reason to rewrite that code.
I did write one parallax effect — see the image behind the sidebar. At first I made the rookie mistake of making the parallax move the reverse of what you’d expect. My designers caught it.
I’m looking forward to using this technology more. So cool.
We use autolayout in one small view in Vesper.
I’m still not sold on it. When I’ve used it, it doesn’t make for less code, and it does make for trickier debugging. I don’t like the way it interferes with animations. (Just animating to new frames doesn’t work — constraints have to be dealt with. Which makes sense, but I don’t like the extra work.)
And it’s not as if
layoutSubviews is particularly hard
But still I have this itchy sense that autolayout is the future and I really need to adopt it. So I will, but incrementally.
Xibs and Storyboards
We use xibs only for the Credits screen, and I’ll probably change that to all code as soon as I get a chance.
I don’t recommend this route for every app. Vesper has very few screens and just about everything is custom. Xibs (and storyboards) don’t buy me anything. (But, again, that’s not true for every app. I don’t recommend going xib-less as a general rule.)
What prevents me from using Core Data at this point is my concern for scalability and performance. It’s possible I’m just being thick-headed.