As a courtesy, this is a full free rendering of my book, Programming iOS 6, by Matt Neuburg. Copyright 2013 Matt Neuburg. Please note that this edition is outdated; the current books are iOS 10 Programming Fundamentals with Swift and Programming iOS 10. If my work has been of help to you, please consider purchasing one or both of them. Thank you!

Programming iOS 6

Revision History
Revision 3.0 Dec 24, 2012

Table of Contents

Preface
1. Acknowledgments for the First Edition
2. Notes on the Second Printing
3. Acknowledgments for the Second Edition
4. Notes on the Second Edition
5. Acknowledgments for the Third Edition
6. Notes on the Third Edition
I. Language
1. Just Enough C
1.1. Compilation, Statements, and Comments
1.2. Variable Declaration, Initialization, and Data Types
1.3. Structs
1.4. Pointers
1.5. Arrays
1.6. Operators
1.7. Flow Control and Conditions
1.8. Functions
1.9. Pointer Parameters and the Address Operator
1.10. Files
1.11. The Standard Library
1.12. More Preprocessor Directives
1.13. Data Type Qualifiers
2. Object-Based Programming
2.1. Objects
2.2. Messages and Methods
2.3. Classes and Instances
2.4. Class Methods
2.5. Instance Variables
2.6. The Object-Based Philosophy
3. Objective-C Objects and Messages
3.1. An Instance Reference Is a Pointer
3.1.1. Instance References, Initialization, and nil
3.1.2. Instance References and Assignment
3.1.3. Instance References and Memory Management
3.2. Messages and Methods
3.2.1. Sending a Message
3.2.2. Declaring a Method
3.2.3. Nesting Method Calls
3.2.4. No Overloading
3.2.5. Parameter Lists
3.2.6. Unrecognized Selectors
3.3. Typecasting and the id Type
3.4. Messages as Data Type
3.5. C Functions
3.6. CFTypeRefs
3.7. Blocks
4. Objective-C Classes
4.1. Class and Superclass
4.2. Interface and Implementation
4.3. Header File and Implementation File
4.4. Class Methods
4.5. The Secret Life of Classes
5. Objective-C Instances
5.1. How Instances Are Created
5.1.1. Ready-Made Instances
5.1.2. Instantiation from Scratch
5.1.3. Nib-Based Instantiation
5.2. Polymorphism
5.3. The Keyword self
5.4. The Keyword super
5.5. Instance Variables and Accessors
5.6. Key–Value Coding
5.7. Properties
5.8. How to Write an Initializer
II. IDE
6. Anatomy of an Xcode Project
6.1. New Project
6.2. The Project Window
6.2.1. The Navigator Pane
6.2.2. The Utilities Pane
6.2.3. The Editor
6.3. The Project File and Its Dependents
6.4. The Target
6.4.1. Build Phases
6.4.2. Build Settings
6.4.3. Configurations
6.4.4. Schemes and Destinations
6.5. From Project to App
6.5.1. Build Settings
6.5.2. Property List Settings
6.5.3. Nib Files and Storyboard Files
6.5.4. Other Resources
6.5.5. Code
6.5.6. Frameworks and SDKs
7. Nib Management
7.1. A Tour of the Nib-Editing Interface
7.1.1. The Dock
7.1.2. Canvas
7.1.3. Inspectors and Libraries
7.2. Nib Loading and File’s Owner
7.3. Making and Loading a Nib
7.4. Outlet Connections
7.4.1. More Ways to Create Outlets
7.4.2. More About Outlets
7.5. Action Connections
7.6. Additional Initialization of Nib-Based Instances
8. Documentation
8.1. The Documentation Window
8.2. Class Documentation Pages
8.3. Sample Code
8.4. Other Resources
8.4.1. Quick Help
8.4.2. Symbols
8.4.3. Header Files
8.4.4. Internet Resources
9. Life Cycle of a Project
9.1. Device Architecture and Conditional Code
9.2. Localization
9.3. Editing Your Code
9.3.1. Autocompletion
9.3.2. Snippets
9.3.3. Fix-it and Live Syntax Checking
9.4. Navigating Your Code
9.5. Debugging
9.5.1. Caveman Debugging
9.5.2. The Xcode Debugger
9.6. Unit Testing
9.7. Static Analyzer
9.8. Clean
9.9. Running in the Simulator
9.10. Running on a Device
9.11. Profile and Device Management
9.12. Version Control
9.13. Instruments
9.14. Distribution
9.15. Ad Hoc Distribution
9.16. Final App Preparations
9.16.1. Icons in the App
9.16.2. Other Icons
9.16.3. Launch Images
9.16.4. Screenshots
9.16.5. Property List Settings
9.17. Submission to the App Store
III. Cocoa
10. Cocoa Classes
10.1. Subclassing
10.2. Categories
10.2.1. Splitting a Class
10.2.2. Class Extensions
10.3. Protocols
10.4. Optional Methods
10.5. Some Foundation Classes
10.5.1. Useful Structs and Constants
10.5.2. NSString and Friends
10.5.3. NSDate and Friends
10.5.4. NSNumber
10.5.5. NSValue
10.5.6. NSData
10.5.7. Equality and Comparison
10.5.8. NSIndexSet
10.5.9. NSArray and NSMutableArray
10.5.10. NSSet and Friends
10.5.11. NSDictionary and NSMutableDictionary
10.5.12. NSNull
10.5.13. Immutable and Mutable
10.5.14. Property Lists
10.6. The Secret Life of NSObject
11. Cocoa Events
11.1. Reasons for Events
11.2. Subclassing
11.3. Notifications
11.3.1. Receiving a Built-In Notification
11.3.2. Unregistering
11.3.3. NSTimer
11.4. Delegation
11.5. Data Sources
11.6. Actions
11.7. The Responder Chain
11.7.1. Deferring Responsibility
11.7.2. Nil-Targeted Actions
11.8. Swamped by Events
11.9. Delayed Performance
11.10. Application Lifetime Events
12. Accessors and Memory Management
12.1. Key–Value Coding
12.1.1. KVC and Outlets
12.1.2. Key Paths and Array Accessors
12.2. Memory Management
12.2.1. Principles of Cocoa Memory Management
12.2.2. The Golden Rules of Memory Management
12.2.3. What ARC Is and What It Does
12.2.4. How Cocoa Objects Manage Memory
12.2.5. Autorelease
12.2.6. Memory Management of Instance Variables (Non-ARC)
12.2.7. Memory Management of Instance Variables (ARC)
12.2.8. Retain Cycles and Weak References
12.2.9. Unusual Memory Management Situations
12.2.10. Nib Loading and Memory Management
12.2.11. Memory Management of Global Variables
12.2.12. Memory Management of Pointer-to-Void Context Info
12.2.13. Memory Management of CFTypeRefs
12.3. Properties
12.3.1. Property Memory Management Policies
12.3.2. Property Declaration Syntax
12.3.3. Property Accessor Synthesis
12.3.4. Dynamic Accessors
13. Data Communication
13.1. Model–View–Controller
13.2. Instance Visibility
13.2.1. Visibility by Instantiation
13.2.2. Visibility by Relationship
13.2.3. Global Visibility
13.3. Notifications
13.4. Key–Value Observing
IV. Views
14. Views
14.1. The Window
14.2. Subview and Superview
14.3. Visibility and Opacity
14.4. Frame
14.5. Bounds and Center
14.6. Transform
14.7. Layout
14.7.1. Autoresizing
14.7.2. Autolayout
14.7.3. Constraints in the Nib
14.7.4. Order of Layout Events
14.7.5. Autolayout and View Transforms
15. Drawing
15.1. UIImage and UIImageView
15.2. Graphics Contexts
15.3. UIImage Drawing
15.4. CGImage Drawing
15.5. CIFilter and CIImage
15.6. Drawing a UIView
15.7. Graphics Context Settings
15.8. Paths and Drawing
15.9. Clipping
15.10. Gradients
15.11. Colors and Patterns
15.12. Graphics Context Transforms
15.13. Shadows
15.14. Points and Pixels
15.15. Content Mode
16. Layers
16.1. View and Layer
16.2. Layers and Sublayers
16.2.1. Manipulating the Layer Hierarchy
16.2.2. Positioning a Sublayer
16.2.3. CAScrollLayer
16.2.4. Layout of Sublayers
16.3. Drawing in a Layer
16.3.1. Content Resizing and Positioning
16.3.2. Layers that Draw Themselves
16.4. Transforms
16.4.1. Depth
16.5. Shadows, Borders, and More
16.6. Layer Efficiency
16.7. Layers and Key–Value Coding
17. Animation
17.1. Drawing, Animation, and Threading
17.2. UIImageView and UIImage Animation
17.3. View Animation
17.3.1. Animation Blocks
17.3.2. Modifying an Animation Block
17.3.3. Transition Animations
17.3.4. Block-Based View Animation
17.4. Implicit Layer Animation
17.4.1. Animation Transactions
17.4.2. Media Timing Functions
17.5. Core Animation
17.5.1. CABasicAnimation and Its Inheritance
17.5.2. Using a CABasicAnimation
17.5.3. Keyframe Animation
17.5.4. Making a Property Animatable
17.5.5. Grouped Animations
17.5.6. Transitions
17.5.7. The Animations List
17.6. Animation and Autolayout
17.7. Actions
17.7.1. What an Action Is
17.7.2. The Action Search
17.7.3. Hooking Into the Action Search
17.7.4. Nonproperty Actions
17.8. Emitter Layers
17.9. CIFilter Transitions
18. Touches
18.1. Touch Events and Views
18.2. Receiving Touches
18.3. Restricting Touches
18.4. Interpreting Touches
18.5. Gesture Recognizers
18.5.1. Gesture Recognizer Classes
18.5.2. Multiple Gesture Recognizers
18.5.3. Subclassing Gesture Recognizers
18.5.4. Gesture Recognizer Delegate
18.5.5. Gesture Recognizers in the Nib
18.6. Touch Delivery
18.6.1. Hit-Testing
18.6.2. Initial Touch Event Delivery
18.6.3. Gesture Recognizer and View
18.6.4. Touch Exclusion Logic
18.6.5. Recognition
18.6.6. Touches and the Responder Chain
V. Interface
19. View Controllers
19.1. The View Controller Hierarchy
19.2. View Controller and View Creation
19.2.1. Manual View
19.2.2. Generic Automatic View
19.2.3. View in a Separate Nib
19.2.4. Nib-Instantiated View Controller
19.2.5. Storyboard-Instantiated View Controller
19.3. Rotation
19.3.1. Rotation and Layout Events
19.3.2. Initial Orientation
19.4. Presented View Controller
19.4.1. Presented View Animation
19.4.2. Presentation Styles
19.4.3. Rotation of a Presented View
19.4.4. Presenting a View in Response to Rotation
19.5. Tab Bar Controllers
19.5.1. Tab Bar Items
19.5.2. Configuring a Tab Bar Controller
19.6. Navigation Controllers
19.6.1. Bar Button Items
19.6.2. Navigation Items
19.6.3. Toolbar Items
19.6.4. Configuring a Navigation Controller
19.7. Page View Controller
19.8. Container View Controllers
19.9. Storyboards
19.9.1. Segues
19.9.2. Unwind Segues
19.9.3. Storyboards and Custom Container View Controllers
19.10. View Controller Lifetime Events
19.11. View Controller Memory Management
19.12. State Restoration
19.12.1. Participating in State Restoration
19.12.2. Restoration ID and Restoration Class
19.12.3. Restoring View Controller State
20. Scroll Views
20.1. Creating a Scroll View
20.2. Scrolling
20.2.1. Paging
20.2.2. Tiling
20.3. Zooming
20.3.1. Zooming Programmatically
20.3.2. Zooming with Detail
20.4. Scroll View Delegate
20.5. Scroll View Touches
20.6. Scroll View Performance
21. Table Views and Collection Views
21.1. Table View Cells
21.1.1. Built-In Cell Styles
21.1.2. Registering a Cell Class
21.1.3. Custom Cells
21.2. Table View Data
21.2.1. The Three Big Questions
21.2.2. Table View Sections
21.2.3. Refreshing Table View Data
21.2.4. Variable Row Heights
21.3. Table View Selection
21.4. Table View Scrolling and Layout
21.5. Table View State Restoration
21.6. Table View Searching
21.7. Table View Editing
21.7.1. Deleting Table Items
21.7.2. Editable Content in Table Items
21.7.3. Inserting Table Items
21.7.4. Rearranging Table Items
21.7.5. Dynamic Table Content
21.8. Table View Menus
21.9. Collection Views
22. Popovers and Split Views
22.1. Configuring and Displaying a Popover
22.2. Managing a Popover
22.3. Dismissing a Popover
22.4. Popovers and Presented Views
22.5. Popover Segues
22.6. Automatic Popovers
22.7. Split Views
23. Text
23.1. Attributed Strings
23.2. UILabel
23.3. UITextField
23.3.1. Summoning and Dismissing the Keyboard
23.3.2. Keyboard Covers Text Field
23.3.3. Configuring the Keyboard
23.3.4. Text Field Delegate and Control Event Messages
23.3.5. The Text Field Menu
23.4. UITextView
23.5. Core Text
24. Web Views
24.1. Loading Web View Content
24.2. Web View State Restoration
24.3. Communicating with a Web View
25. Controls and Other Views
25.1. UIActivityIndicatorView
25.2. UIProgressView
25.3. UIPickerView
25.4. UISearchBar
25.5. UIControl
25.5.1. UISwitch
25.5.2. UIStepper
25.5.3. UIPageControl
25.5.4. UIDatePicker
25.5.5. UISlider
25.5.6. UISegmentedControl
25.5.7. UIButton
25.5.8. Custom Controls
25.6. Bars
25.6.1. UINavigationBar
25.6.2. UIToolbar
25.6.3. UITabBar
25.7. Appearance Proxy
26. Modal Dialogs
26.1. Alert View
26.2. Action Sheet
26.3. Dialog Alternatives
26.4. Local Notifications
26.5. Activity View
VI. Some Frameworks
27. Audio
27.1. System Sounds
27.2. Audio Session
27.2.1. Interruptions
27.2.2. Routing Changes
27.3. Audio Player
27.4. Remote Control of Your Sound
27.5. Playing Sound in the Background
27.6. Further Topics in Sound
28. Video
28.1. MPMoviePlayerController
28.2. MPMoviePlayerViewController
28.3. UIVideoEditorController
28.4. Introduction to AV Foundation Video
29. Music Library
29.1. Exploring the Music Library
29.2. The Music Player
29.3. The Music Picker
30. Photo Library and Image Capture
30.1. UIImagePickerController
30.1.1. Choosing from the Photo Library
30.1.2. Using the Camera
30.2. Image Capture With AV Foundation
30.3. The Assets Library Framework
31. Address Book
31.1. Address Book Database
31.2. Address Book Interface
31.2.1. ABPeoplePickerNavigationController
31.2.2. ABPersonViewController
31.2.3. ABNewPersonViewController
31.2.4. ABUnknownPersonViewController
32. Calendar
32.1. Calendar Database
32.2. Calendar Interface
33. Mail and Messages
33.1. Mail Message
33.2. Text Message
33.3. Twitter Post
34. Maps
34.1. Displaying a Map
34.2. Annotations
34.3. Overlays
34.4. Map Kit and Current Location
34.5. Geocoding
34.6. Communicating With the Maps App
35. Sensors
35.1. Location
35.2. Heading
35.3. Acceleration and Attitude
35.3.1. Shake Events
35.3.2. Raw Acceleration
35.3.3. Gyroscope
VII. Final Topics
36. Persistent Storage
36.1. The Sandbox
36.2. Basic File Operations
36.3. Saving and Reading Files
36.4. User Defaults
36.5. File Sharing
36.6. Document Types
36.7. Handing Off a Document
36.8. The Document Architecture
36.9. iCloud
36.10. XML
36.11. SQLite
36.12. Core Data
36.13. Image File Formats
37. Basic Networking
37.1. HTTP Requests
37.2. Bonjour
37.3. Push Notifications
37.4. Beyond Basic Networking
38. Threads
38.1. The Main Thread
38.2. Why Threading Is Hard
38.3. Three Ways of Threading
38.3.1. Manual Threads
38.3.2. NSOperation
38.3.3. Grand Central Dispatch
38.4. Threads and App Backgrounding
39. Undo
39.1. The Undo Manager
39.2. The Undo Interface
39.3. The Undo Architecture
40. Epilogue
Index

List of Figures

1.1. Pointers and assignment
1.2. How a large C program is divided into files
2.1. Class and instance
2.2. Instance variables
2.3. A stack
3.1. Two instances end up with pointers to the same third instance
4.1. Browsing the built-in class hierarchy in Xcode
5.1. Dragging a button into a view
5.2. The meaning of self
5.3. Class inheritance, overriding, self, and polymorphism
6.1. The project window, on steroids
6.2. The Project navigator
6.3. The Search navigator
6.4. The Debug layout
6.5. Viewing a log
6.6. Telling an assistant pane to display counterparts
6.7. The Project navigator again
6.8. The project folder
6.9. Build phases
6.10. Target build settings
6.11. Configurations
6.12. The scheme editor
6.13. The Scheme pop-up menu
6.14. The built app, in the Finder
6.15. Contents of the app package
6.16. Options when adding a resource to a project
7.1. Editing a nib file
7.2. The dock, expanded
7.3. Dragging a button into a view
7.4. The Empty Window app’s window is empty no longer
7.5. How an outlet provides a reference to a nib-instantiated object
7.6. Editing a nib, with code in the assistant pane
7.7. Connecting an outlet from the Connections inspector
7.8. Connecting an outlet by Control-dragging from the source object
7.9. Connecting an outlet by dragging from the Connections HUD
7.10. Connecting an action from the Connections inspector
7.11. Connecting an action to a method implementation
8.1. The start of a typical class documentation page
9.1. How a localized strings file is represented in Xcode
9.2. The autocompletion menu
9.3. A warning with a Fix-it suggestion
9.4. A breakpoint
9.5. A disabled breakpoint
9.6. Paused at a breakpoint
9.7. A valid development certificate, as shown in Keychain Access
9.8. Version comparison
9.9. Instruments graphs memory usage over time
9.10. Instruments describes a leak
9.11. A time profile in Instruments
9.12. Drilling down into the time profile
9.13. My code, time-profiled
11.1. The target–action architecture
12.1. An outlet graph with retain
13.1. Model–view–controller
13.2. The global visibility of user defaults
14.1. Overlapping views
14.2. A view hierarchy as displayed in the nib
14.3. A subview inset from its superview
14.4. A subview exactly covering its superview
14.5. The superview’s bounds origin has been shifted
14.6. A rotation transform
14.7. A scale transform
14.8. Translation, then rotation
14.9. Rotation, then translation
14.10. Rotation, then translation, then inversion of the rotation
14.11. Skew (shear)
14.12. Before autoresizing
14.13. After autoresizing
14.14. A view’s constraints displayed in the nib
14.15. An equal widths constraint configured in the nib
15.1. Mars appears in my interface
15.2. Tiling the entire image of Mars
15.3. Tiling the interior of Mars
15.4. Stretching the interior of Mars
15.5. Stretching a single pixel at the interior of Mars
15.6. Two images of Mars combined side by side
15.7. Two images of Mars in different sizes, composited
15.8. Half the original image of Mars
15.9. Image of Mars split in half
15.10. A photo of me, vignetted
15.11. A photo of me, tiled
15.12. The very strange behavior of CGContextClearRect
15.13. A simple path drawing
15.14. Drawing with a gradient
15.15. A patterned fill
15.16. Drawing rotated with a CTM
15.17. Drawing with a shadow
15.18. Automatic stretching of content
16.1. A compass, composed of layers
16.2. A hierarchy of views and the hierarchy of layers underlying it
16.3. Layers that have sublayers of their own
16.4. A view and a layer delegate that draws into it
16.5. One way of resizing the compass arrow
16.6. A gradient drawn behind the compass
16.7. An anchor point plus a vector defines a rotation plane
16.8. A disappointing page-turn rotation
16.9. A dramatic page-turn rotation
16.10. Page-turn rotation applied to a CATransformLayer
16.11. A layer with a mask
17.1. An ease-in-out Bézier curve
17.2. A boat and the course she’ll sail
17.3. A push transition
17.4. Another push transition
17.5. A really boring emitter layer
17.6. An emitter layer that makes a sort of waterfall
17.7. The waterfall makes a kind of splash
17.8. Midway through a starburst transition
19.1. The TidBITS News app
19.2. The TidBITS News app’s initial view controller and view hierarchy
19.3. A Latin flashcard app
19.4. The Latin flashcard app’s initial view controller and view hierarchy
19.5. The Latin flashcard app, in drill mode
19.6. The Latin flashcard app’s drill mode view controller and view hierarchy
19.7. Two views that are equal partners
19.8. A familiar navigation interface
19.9. A segmented control in the center of a navigation bar
19.10. A highly dynamic navigation bar
20.1. The Zotz! settings view
20.2. The Zotz! settings view, designed in the nib
20.3. A scroll view coordinated with a page control
20.4. A scrollable map with a draggable flag
21.1. Four table view variations
21.2. A grouped table view as an interface for choosing options
21.3. A cell with an image background
21.4. A cell with a custom gradient background
21.5. A cell with its label and image view swapped
21.6. Designing a static table in the storyboard editor
21.7. Filtering a table with a search bar
21.8. A simple phone directory app
21.9. Phone directory app in editing mode
21.10. A table view cell with a menu
21.11. A collection view in my Latin flashcard app
22.1. Two popovers
22.2. A very silly popover
22.3. An automatically created search results popover
22.4. A familiar split view interface
23.1. A label showing an attributed string
23.2. A label showing another attributed string
23.3. A single label containing two differently styled paragraphs
23.4. The TidBITS News app, rewritten for iOS 6
23.5. A single line of text, drawn by Core Text
23.6. Text wrapped and centered, drawn by Core Text
23.7. Two-column text in small caps
23.8. The user has tapped on California
24.1. A Help screen that’s a web view
24.2. A web view with dynamically formed content
25.1. A large activity indicator
25.2. A progress view
25.3. A custom progress view
25.4. A picker view
25.5. A search bar with a search results button
25.6. A horrible search bar
25.7. A switch in iOS 5
25.8. A switch in iOS 6, with custom colors
25.9. A switch in iOS 6, with custom words
25.10. A stepper
25.11. A customized stepper
25.12. Repositioning a slider’s images and track
25.13. Replacing a slider’s thumb
25.14. Replacing a slider’s track
25.15. A segmented control
25.16. A segmented control, customized
25.17. A button with an attributed title
25.18. A button with highlighted glow
25.19. A custom control
25.20. A colorful navigation bar
25.21. A navigation bar
25.22. Automatically generated More list
25.23. Customized More list
26.1. An alert view
26.2. An action sheet on the iPhone
26.3. An action sheet presented as a popover
26.4. An action sheet presented inside a popover
26.5. A presented view functioning as a modal dialog
26.6. An alert posted by the system when a local notification fires
26.7. An activity view
27.1. The software remote controls in the app switcher
27.2. The software remote controls on the locked screen
28.1. A movie player with controls
28.2. A movie player when the movie is a sound file
28.3. A movie player in fullscreen mode, with controls
28.4. A fullscreen movie player when the movie is a sound file
28.5. A movie player whose view fits its movie
28.6. The black square’s position is synchronized to the movie
30.1. The system prompts for photo library access
30.2. The image picker, when the user has denied access
31.1. A contact created programmatically
32.1. The user specifies a span
32.2. The event interface
34.1. A map view showing a happy place
34.2. A simple annotation
34.3. A custom annotation image
34.4. An overlay view
34.5. A nicer overlay view
34.6. The Maps app displays our point of interest
36.1. The iTunes file sharing interface
36.2. The document Open In activity view
36.3. The People Groups interface
36.4. Defining a custom UTI
36.5. The Core Data model for the People Groups app
39.1. The shake-to-edit undo/redo interface
39.2. The shared menu as an undo/redo interface

List of Examples

1.1. The C flow control constructs
1.2. A switch statement
1.3. Declaring, calling, and defining a function
3.1. Using a pointer to a callback function
3.2. Using a block instead of a callback function
4.1. Conventional schema for defining a class
5.1. The basic pattern for instantiation from scratch
5.2. Polymorphism in action
5.3. Conventional schema for an initializer
10.1. Building an array by enumerating another array
10.2. Parsing a file with Foundation classes
12.1. Imaginary scenario: ARC’s conservative memory management
12.2. How non-ARC code ensures a collection element’s persistence
12.3. Imaginary scenario: ARC ensures a collection element’s persistence
12.4. A simple retaining setter
12.5. A simple initializer that retains an ivar
12.6. A simple initializer that copies an ivar
12.7. A simple initializer that retains an ivar under ARC
12.8. A simple initializer that copies an ivar under ARC
12.9. The weak–strong dance prevents a copied block from retaining self
12.10. A private property
12.11. Overriding synthesized accessors
15.1. Utility for flipping an image drawing
21.1. The world’s simplest table
29.1. A presented view on the iPhone, a popover on the iPad