Wow, nice. Thanks for this example. And what perfect timing! I was planning on trying to implement exactly this effect tonight, and it was great to have an example to follow.

I have noticed an issue, and was wondering if you had any thoughts. I am doing the "Push" transition, with 2 views that have a solid background, and I want their edges to be touching. It looks like frames of the animation are drawn where one view has moved, but the other hasn't, so that there is a gap between the two views, or they can be overlapped slightly.

To recreate this your example, I edited the nib to make each of your subviews have a solid color in the background (by putting a NSTextView behind everything, making it the full size of the view, setting its background color, and turning off the scrollbar), and put another solid background behind everything in the main window in the same way (preferable all different colors). Then I slowed down the animation by putting
[animation setDuration:(NSTimeInterval)3.0];
in Controller.m:203. Then do the push transition, and you can see it, but only on every other swap (I think because you can only tell when they have a gap, and not when they overlap). I was wondering if you knew of any tricks to sync the animation, or otherwise deal with this. The weird thing is that if you don't put that background in the main window (and just put a background on each subview), then you don't see any gap. Maybe there is another subtlety that's causing this?

Also, are there any tricks to make the animation run smoother? Mine are pretty choppy, especially when the window is big. It looks like the subviews are getting redrawn at each step of the animation (though, I'm not sure what exactly is triggering the redraw. Should it not be doing this?). To reduce the cost of redrawing, I was thinking of creating a NSImage with a bitmap snapshot of each subview, and animating with those instead. Or somehow otherwise manually forcing them not to draw themselves during the animation. Or am I just doing something wrong? Alternatively, I could put the subviews side-by-side in an NSClipView and just scroll that (with setCopiesOnScroll:YES), but then I miss out on all this nice NSViewAnimation stuff.

Finally, you mention the CI transitions, and I've played with some of those (from the example code here: http://dev.lipidity.com/apple/core-graphics-meet-core-image-demo-app ), but all of the non-cheesy transitions are the CG ones, which move the whole window. Do you know if there is a way to do the CG transitions (CGFade, CGSlide, etc) just within the window bounds?

Thanks again for this example.