Digging into PastryKit
If you haven’t already, go read the DaringFireball piece on PastryKit. Are you back? Good. If you’re the least bit like me, you’re probably a least a little bit intrigued. If you’re sorta like me you probably cut and pasted http://help.apple.com/iphone/3/mobile/dist/PastryKit-ug-compact.js into jsbeautifier.org. If you’re kinda like me you also dug into http://help.apple.com/iphone/3/mobile/javascript.js to see how PastryKit is used. And finally, if you’re exactly like me, you’ve probably already dissected the framework and won’t need to read this post 🙂
PastryKit, at least the one on the iPhone User Guide, contains (it’s possible their compiler strips out classes/functions their site doesn’t use)
- PKUtils – collection of util functions (eg. degreesToRadians, objectHasMethod, etc)
- PKClass, PKObject – classes that make inheritance easier. PKObjects to have observer methods for properties and PKClasses are able to synthetize properties ala ObjC.
- PKPoint, PKSize, PKImage – self explanatory OOO objects for points, sizes, and <img>
- PKAnimator – simple animator class taskrunner/setTimeout style. Even PastryKit doesn’t use WebKitAnimations since the API is fubar’d! As far as I can tell nothing in the framework or iPhone User Guide uses this
- PKTransition – This is where all the real animation is done, including the scroll effect, has the ability to commit animation transactions.
- PKView, PKContentView, PKRootView – View hierarchy, akin to one you would set up in Interface Builder. Very Xcode. I echo Gruber’s sentiments that PastryKit could show up in the next DashCode. Or at the very least the remnants of Apple’s web apps as an app strategy circa 2008.
- PKScrollIndicator – The magical class that creates the DHTML scrollbar when a view is scrolled.
- PKSearchBar, PKTableView, PKNavigationView, PKToolbar – the main view classes used to construct an actual app. (Along with PKScrollView, PKTableViewCell, PKNavigationItem, PKControl)
If you’ve built anything in Xcode all this seems very familiar. Applications are built by setting up a hierarchy of views such as:
// create a new navigation view navigation = new PKNavigationView(); // set a size for the view navigation.size = new PKSize(height, width); // init some basic parameters about the view // add the view to the root view PKRootView.sharedRoot.addSubview(navigation); // build the rest of your views
I gave myself a couple hours to build a basic view app from scratch using PastryKit. It was painful and time consuming. There are plenty of methods that are required by the framework that you must declare unknowingly (eg. tableViewCellForRowAtPath vs tableViewCustomCellForRowAtPath dependent on what your table view is styled). Without proper documentation the framework is difficult to do any real work with. I’ll tinker with it some more but if you’re interested in a semi-prepackaged PastryKit and my work so far you can grab it here.
PKScrollIndicator is the best part of the framework, jQTouch should definitely look into “borrowing” this code. Meanwhile, I’ll be waiting for a documented official release of PastryKit.
Bonus: You can use the following to disable scrolling in Mobile Safari.
document.addEventListener('touchmove', function(e) { e.preventDefault(); }, true);
This coupled with window.scrollTo(0,0) is how PastryKit hides the navigation bar.
Update: Sorry, should be document.addEventListener() instead of window.addEventListener(). I’ve added a demo no scroll page here. Just view the source.