100% found this document useful (5 votes)
3K views57 pages

Standford CS 193P: 05-Views Animation

Views arranged in a hierarchical fashion every view has one superview # every view has zero or more subviews # questions that immediately arise: what view-related structures exist? # location in space: x and y components dimensions of something: width and height components location and dimension: origin and size # y axis grows downwards # CGRect origin size x y CGPoint UIView coordinate system # Bounds is in terms of local coordinate system # 550 View A location

Uploaded by

Oleksiy Kovyrin
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
3K views57 pages

Standford CS 193P: 05-Views Animation

Views arranged in a hierarchical fashion every view has one superview # every view has zero or more subviews # questions that immediately arise: what view-related structures exist? # location in space: x and y components dimensions of something: width and height components location and dimension: origin and size # y axis grows downwards # CGRect origin size x y CGPoint UIView coordinate system # Bounds is in terms of local coordinate system # 550 View A location

Uploaded by

Oleksiy Kovyrin
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 57

CS193P - Lecture 5

iPhone Application Development

Views
Drawing
Animation
Today’s Topics
• Questions from previous lectures or assignments?
• Views
• Drawing
• Animation
Views
View Fundamentals
• Rectangular area on screen
• Draws content
• Handles events
• Subclass of UIResponder (which defines event handling API)
• Views arranged in a hierarchical fashion
■ every view has one superview
■ every view has zero or more subviews

• Questions that immediately arise:


■ what view-related structures exist?
■ what is the coordinate system?
View-related Structures
• CGPoint
■ location in space: x and y components
• CGSize
■ dimensions of something: width and height components
• CGRect
■ location and dimension: origin and size
Rects, Points and Sizes
y
CGRect

origin CGPoint 80
x 80
size 54
y 54
(0, 0) x

144
CGSize

width 144
72
height 72
View-related Structure

Creation Function Example

CGPoint point = CGPointMake (100.0, 200.0);


CGPointMake (x, y) point.x = 300.0;
point.y = 30.0;

CGSize size = CGSizeMake (42.0, 11.0);


CGSizeMake (width, height) size.width = 100.0;
size.height = 72.0;

CGRect rect = CGRectMake (100.0, 200.0,


CGRectMake (x, y, 42.0, 11.0);
width, height) rect.origin.x = 0.0;
rect.size.width = 50.0;
UIView Coordinate System
■ Origin in upper left corner
■ y axis grows downwards

0, 0
+x

+y
UIView Coordinate System
■ Origin in upper left corner
■ y axis grows downwards

0, 0
+x

UIView

+y
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

View A
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A

400
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400

View A bounds:
origin: 0, 0
size: 550 x 400

400
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400

View A bounds:
View B origin: 0, 0
size: 550 x 400

400
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400
200, 100
View A bounds:
View B origin: 0, 0
size: 550 x 400

400
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400
200, 100 200
View A bounds:
View B origin: 0, 0
size: 550 x 400

400 250
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400
200, 100 200
View A bounds:
View B origin: 0, 0
size: 550 x 400

400 250
View B frame:
origin: 200, 100
size: 200 x 250
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400
200, 100 200
0, 0 View A bounds:
View B origin: 0, 0
size: 550 x 400

400 250
View B frame:
origin: 200, 100
size: 200 x 250
Location and Size
• View’s location and size expressed in two ways
■ Frame is in terms of superview’s coordinate system
■ Bounds is in terms of local coordinate system

0, 0 550
View A frame:
View A origin: 0, 0
size: 550 x 400
200, 100 200
0, 0 View A bounds:
View B origin: 0, 0
size: 550 x 400

400 250
View B frame:
origin: 200, 100
size: 200 x 250

View B bounds:
origin: 0, 0
size: 200 x 250
Frame and Bounds
• Which to use?
■ Usually depends on the context
• If you are using a view, typically you use frame
• If you are implementing a view, typically you use bounds
• Matter of perspective
■ From outside it’s usually the frame
■ From inside it’s usually the bounds

• Examples:
■ Creating a view, positioning a view in superview - use frame
■ Handling events, drawing a view - use bounds
View Hierarchy - UIWindow
• Views live inside of a window
• Instance of UIWindow, container of all views for an iPhone app
■ apps have single window
■ usually set up in template project

• UIWindow is actually just a view


■ adds some additional functionality specific to top level view
View Hierarchy - Manipulation
• Add/remove views in IB or using UIView methods
- (void)addSubview:(UIView *)view;
- (void)removeFromSuperview;
• Manipulate the view hierarchy manually:
- (void)insertSubview:(UIView *)view atIndex:(int)index;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)view;
- (void)exchangeSubviewAtIndex:(int)index
withSubviewAtIndex:(int)otherIndex;
View Hierarchy - Ownership
• Superviews retain their subviews
• Not uncommon for views to only be retained by superview
■ Be careful when removing!
■ Retain subview before removing if you want to reuse it

• Views can be temporarily hidden


[theView setHidden:YES];
Creating Views
Where do views come from?
• Commonly Interface Builder
• Drag out any of the existing view objects (buttons, labels, etc)
• Or drag generic UIView and set custom class
Manual Creation
• Views are initialized using -initWithFrame:
CGRect frame = CGRectMake(0, 0, 200, 150);
UIView *myView = [[UIView alloc] initWithFrame:frame];

• Example:
CGRect frame = CGRectMake(20, 45, 140, 21);
UILabel *label = [[UILabel alloc] initWithFrame:frame];

[window addSubview:label];
[label setText:@”Number of sides:”];
[label release]; // label now retained by window
Custom Views
• Subclass UIView
• For custom drawing, you override:
- (void)drawRect:(CGRect)rect;
• For event handling, you override:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
Drawing Views
- (void)drawRect:(CGRect)rect
• UIView’s drawRect: implementation does nothing
■ If no overridden drawRect: then backgroundColor used to fill
• Override - drawRect: to draw a custom view
■ rect argument is area to draw
• When is it OK to call drawRect:?
Be Lazy
• drawRect: is invoked automatically
■ Don’t call it directly!
• When a view needs to be redrawn, use:
- (void)setNeedsDisplay;

• For example, in your controller:


- (void)setNumberOfSides:(int)sides {
numberOfSides = sides;
[polygonView setNeedsDisplay];
}
CoreGraphics and Quartz 2D
• UIKit offers very basic drawing functionality
UIRectFill(CGRect rect);
UIRectFrame(CGRect rect);
• Many types and drawing functions defined in CoreGraphics
• CG is a C-based API, not Objective-C
• CG and Quartz 2D drawing engine define simple but powerful
graphics primitives
■ Graphics context
■ Transformations

■ Paths

■ Colors

■ Fonts

■ Painting operations
Graphics Contexts
• All drawing is done into an opaque graphics context
• Actual output destination could be a screen, bitmap buffer,
printer, PDF document, etc.
• Graphics context setup automatically before invoking drawRect:
■ Defines current path, line width, transform, etc.
■ Access the graphics context within drawRect: by calling

(CGContextRef)UIGraphicsGetCurrentContext(void);
■ Use CG calls to change settings
• Context only valid for current call to drawRect:
■ Don’t try to cache them!
CG Wrappers
• Some CG functionality wrapped by UIKit
• UIColor
■ Convenience for getting common colors
■ Easily set the fill and/or stroke colors when drawing

UIColor *redColor = [UIColor redColor];


[redColor set];
// drawing will be done in red
• UIFont
■ Access system font
■ Get font by name

UIFont *font = [UIFont systemFontOfSize:14.0];


[myLabel setFont:font];
Simple drawRect: example
• Draw a solid color and shape
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];

[[UIColor grayColor] set];


UIRectFill (bounds);

CGRect square = CGRectMake (10, 10, 50, 100);


[[UIColor redColor] set];
UIRectFill (square);

[[UIColor blackColor] set];


UIRectFrame (square);
}
Simple drawRect: example
• Draw a solid color and shape
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];

[[UIColor grayColor] set];


UIRectFill (bounds);

CGRect square = CGRectMake (10, 10, 50, 100);


[[UIColor redColor] set];
UIRectFill (square);

[[UIColor blackColor] set];


UIRectFrame (square);
}
Drawing More Complex Shapes
• Common steps for drawRect: are
■ Get current graphics context
■ Define a path

■ Set a color

■ Stroke or fill path

■ Repeat, if necessary
Paths
• CoreGraphics paths define shapes
• Made up of lines, arcs, curves and rectangles
• Creation and drawing of paths are two distinct operations
■ Define path first, then draw it
CGPath
• Two parallel sets of functions for using paths
■ CGContext “convenience” throwaway functions
■ CGPath functions for creating reusable paths

CGContext CGPath
CGContextMoveToPoint CGPathMoveToPoint
CGContextLineToPoint CGPathAddLineToPoint
CGContextAddArcToPoint CGPathAddArcToPoint
CGContextClosePath CGPathCloseSubPath
And so on and so on . . .
Simple Path Example
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

[[UIColor grayColor] set];


UIRectFill ([self bounds]);

CGContextBeginPath (context);
CGContextMoveToPoint (context, 75, 10);
CGContextAddLineToPoint (context, 10, 150);
CGContextAddLineToPoint (context, 160, 150);
CGContextClosePath (context);

[[UIColor redColor] setFill];


[[UIColor blackColor] setStroke];
CGContextDrawPath (context, kCGPathFillStroke);
}
Simple Path Example
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

[[UIColor grayColor] set];


UIRectFill ([self bounds]);

CGContextBeginPath (context);
CGContextMoveToPoint (context, 75, 10);
CGContextAddLineToPoint (context, 10, 150);
CGContextAddLineToPoint (context, 160, 150);
CGContextClosePath (context);

[[UIColor redColor] setFill];


[[UIColor blackColor] setStroke];
CGContextDrawPath (context, kCGPathFillStroke);
}
More Drawing Information
• UIView Class Reference
• CGContext Reference
• “Quartz 2D Programming Guide”
• Lots of samples in the iPhone Dev Center
View Properties & Animation
View Properties
• Views have many properties
■ bounds, alpha, transform, backgroundColor, hidden, etc
• View subclasses add many more
■ UIControl: enabled, selected, highlighted
■ UILabel: font, textColor, shadowColor, textAlignment, etc

■ UIButton: font, title, titleColor, image, backgroundImage

• Most properties settable in IB


■ If not in Attributes Inspector, need to set in code
• See class reference documentation for all properties
Animating Views
• Consider example where a view needs to resize or change
layout dynamically
• For example, user toggles a switch which displays additional
views
Animating Views
• Consider example where a view needs to resize or change
layout dynamically
• For example, user toggles a switch which displays additional
views
Animating Views
• Consider example where a view needs to resize or change
layout dynamically
• For example, user toggles a switch which displays additional
views
UIView Animations
• UIView supports a number of animatable properties
■ frame, bounds, center, alpha, transform
• Create “blocks” around changes to animatable properties
• Animations run asynchronously and automatically
Other Animation Options
• Additional methods for other options
■ delay before starting animation
■ start animation at specific time

■ set animation curve (ease in/out, ease in, ease out, linear)

■ repeat count

■ autoreverses (e.g. ping pong back and forth)


Animation Examples
View Animation Example
- (void)showAdvancedOptions {
// assume polygonView and optionsView
[UIView beginAnimations:@”advancedAnimations” context:nil];
[UIView setAnimationDuration:0.3];

// make optionsView visible (alpha is currently 0.0)


optionsView.alpha = 1.0;

// move the polygonView down


CGRect polygonFrame = polygonView.frame;
polygonFrame.origin.y += 200;
polygonView.frame = polygonFrame;

[UIView commitAnimations];

}
Knowing When Animations Finish
• UIView animations allow for a delegate
[UIView setAnimationDelegate:myController];

• myController will have callbacks invoked before and after


- (void)animationWillStart:(NSString *)animationID
context:(void *)context;

- (void)animationDidStop:(NSString *)animationID
finished:(NSNumber *)finished
context:(void *)context;

• Can provide custom selectors if desired, for example


[UIView setAnimationWillStartSelector:
@selector(animationWillStart)];
[UIView setAnimationDidStopSelector:
@selector(animationDidStop)];
How Does It Work?
• Is drawRect: invoked repeatedly?
• Do I have to run some kind of timer in order to drive the
animation?
• Is it magic?
Core Animation
• Hardware accelerated rendering engine
• UIViews are backed by Core Animation “layers”
• First time drawRect: is called on UIView results are cached
■ If view’s contents don’t change drawRect: never called again
■ Cached results used to render view

■ Layers maintained in separate hierarchy managed by separate

process
• Rendering of layers uses cached results
• Property animations done automatically by manipulating layers
View Transforms
• Every view has a transform property
■ used to apply scaling, rotation and translation to a view
• By default a view’s transform is the identity transform
■ no affect on the view
• CGAffineTransform structure used to represent transform
• Use CG functions to create, modify transforms
CGAffineTransform Functions (just a small example set)
CGAffineTransformScale (transform, xScale, yScale)
CGAffineTransformRotate (transform, angle)

CGAffineTransformTranslate (transform, xDelta, yDelta)


More Animation Information
• iPhone OS Programming Guide
■ “Modifying Views at Runtime” section
• Core Animation Programming Guide
View Example Project
Questions?

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy