Slide 1

Slide 1 text

Using Images in iOS Jeff Kelley | @SlaunchaMan CodeMash 2012

Slide 2

Slide 2 text

Who Am I?

Slide 3

Slide 3 text

Using Images in iOS

Slide 4

Slide 4 text

Using Images in iOS

Slide 5

Slide 5 text

Why A Talk About Images?

Slide 6

Slide 6 text

iDevice Displays

Slide 7

Slide 7 text

Image Pitfalls • One uncompressed Retina iPad image file: ~12 MB • App Store download limit for non-WiFi connections: 50 MB • One uncompressed background image for all resolutions: ~18 MB

Slide 8

Slide 8 text

Special Images in the Bundle • Icon Files • 29x29 (iPhone Settings) • 50x50 (iPad Search Results) • 57x57 (iPhone Icon) • 58x58 (iPhone Settings, Retina) • 72x72 (iPad Icon) • 100x100 (iPad Search Results, Retina) • 114x114 (iPhone Icon, Retina) • 144x144 (iPad Icon, Retina)

Slide 9

Slide 9 text

Special Images in the Bundle • iTunes Artwork • Include as ‘iTunesArtwork’ (no extension) for ad-hoc builds • now must be 1024x1024 • Warn your designer! • Consider using vector graphics

Slide 10

Slide 10 text

Special Images in the Bundle • Default Images • Display while your app is launching • One for each resolution/rotation • Separate image for iPhone 5 • The presence of this image indicates whether your app has iPhone 5 support

Slide 11

Slide 11 text

How can we balance good UIs with image sizes?

Slide 12

Slide 12 text

UIImage • The highest-level image representation in Cocoa Touch • Create from a file, from data, or from lower-level representations • Represents an image, not image data (more on that later)

Slide 13

Slide 13 text

Creating a UIImage • From a File: UIImage *myImage = [[UIImage alloc] initWithContentsOfFile:myPath]; • From Data: UIImage *myImage = [[UIImage alloc] initWithData:myData];

Slide 14

Slide 14 text

Cached Images • Using the class method +imageNamed:, you can create an image from the main bundle • These images are cached automatically • For PNG images, you can leave off the extension

Slide 15

Slide 15 text

Image Cache Behavior • In low-memory situations, a UIImage’s image data will be purged • This data will be reloaded once the image is needed again

Slide 16

Slide 16 text

Using Images • Usually: UIImageView • Occasionally: Create an NSData object using UIImagePNGRepresentation() or UIImageJPEGRepresentation().

Slide 17

Slide 17 text

Retina Graphics • Everything on an iOS display is measured in points, not pixels • To get the pixel dimensions of an image, multiply scale by size • Images created with +imageNamed: automatically seek out image files with the “@2x” suffix before the extension • “image.png” and “[email protected]

Slide 18

Slide 18 text

Retina Graphics • Tell your designers: design for non-Retina, create for Retina • Yes, this is hard. • Retina graphics must be exactly twice the scale—no odd dimensions. • Even with drop shadows!

Slide 19

Slide 19 text

Image Tips & Tricks

Slide 20

Slide 20 text

Stretchable Images • Once you have an image, you can create a resizable version that can resize to any arbitrary size • - (UIImage *)resizableImageWithCapInsets: (UIEdgeInsets)capInsets; • The inner portion is tiled or stretched

Slide 21

Slide 21 text

Stretchable Images Top Bottom Left Right

Slide 22

Slide 22 text

Demo

Slide 23

Slide 23 text

Animated Images • Load individual frames of an animation as separate images and cycle through them • Can initialize with an array of images or with a prefix • Up to 1,024 frames

Slide 24

Slide 24 text

Animated Images • Creating from a prefix: + (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration; • Creating from an array: + (UIImage *)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration;

Slide 25

Slide 25 text

Demo

Slide 26

Slide 26 text

Animated Images • If you’re really crazy: • + (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets duration: (NSTimeInterval)duration;

Slide 27

Slide 27 text

Image Patterns • Sometimes you want to make a tiny image repeat, such as in a background • Create a UIColor object with the image as a pattern: UIColor *myPatternColor = [UIColor colorWithPatternImage:myImage]; • Great way to save space

Slide 28

Slide 28 text

Demo

Slide 29

Slide 29 text

“We’ll Do It Live!”: Rendering with CoreGraphics

Slide 30

Slide 30 text

CoreGraphics • AKA QuartzCore () • Allows you to draw graphics yourself as opposed to including images

Slide 31

Slide 31 text

Custom View Rendering • The easiest path to custom drawing • Override -drawRect:

Slide 32

Slide 32 text

Graphics Contexts • Graphics contexts, represented by the CGContext opaque type, are the thing you draw into • In -drawRect:, you can get the current context with UIGraphicsGetCurrentContext()

Slide 33

Slide 33 text

Demo

Slide 34

Slide 34 text

Custom Drawing • A view doesn’t always redraw itself • Call -setNeedsDisplay to mark it as dirty • When marked as dirty, will re-draw in the event loop

Slide 35

Slide 35 text

Custom Drawing • Can be a performance problem • Lots of duplicate rendering effort

Slide 36

Slide 36 text

Problem: Interpolation • Images resized in UIImageViews have no control over interpolation quality • Bad solution: multiple images in the bundle, resized to the necessary sizes • How can we resize an image with good quality?

Slide 37

Slide 37 text

Interpolating with CoreGraphics • Create a new bitmap graphics context • Set its interpolation quality to high • Draw the original image into the context • Get a new image

Slide 38

Slide 38 text

Demo

Slide 39

Slide 39 text

Image Data • CoreGraphics is fun and all, but sometimes you need to access pixel data • What is pixel data? How is it formatted • iOS uses (mostly) RGBA8888 format • What the heck does that mean?

Slide 40

Slide 40 text

Color Spaces • CGColorSpace opaque type • Two main color spaces to worry about: • CGColorSpaceCreateDeviceGray() • CGColorSpaceCreateDeviceRGB() • Defines the number of components

Slide 41

Slide 41 text

Graphics Context Options •CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo );

Slide 42

Slide 42 text

Getting Pixel Data • Create a buffer of pixel data to draw into • We’ll use uint8_t for unsigned 8-bit integers • Create a bitmap image context • Draw the image into the context • Voilà!

Slide 43

Slide 43 text

Getting Pixel Data • Why didn’t we just ask the image for its data? • Drawing it into our own context give us a mutable version of it • We know the color space we’re using

Slide 44

Slide 44 text

Demo

Slide 45

Slide 45 text

Generating Pixel Data • Remember before when we made a bitmap graphics context with data? • Turns out you can pre-fill that data with your own pixels

Slide 46

Slide 46 text

Demo

Slide 47

Slide 47 text

Additional Topics • OpenGL • CoreImage • Vector Graphics

Slide 48

Slide 48 text

AmazeKit • Image rendering library for iOS • Uses stacked image effects, analogous to Photoshop layer styles • Renders UI into image, caches heavily • Allows for small bundle sizes, rendered-on- demand UI • Soon to be open-sourced

Slide 49

Slide 49 text

AmazeKit Example