- 浏览: 773736 次
- 性别:
- 来自: 天堂
文章分类
最新评论
-
xiaozhao-521:
呀呀呀呀呀呀呀
RequestTest222 -
Andy_hyh:
打扰了,问下openmeeting源码可以运行起来吗?
Openmeetings安装 详细步骤 -
qindongliang1922:
擦,现在还行么,厉害
北京免费吃饭的地方 -
minixx77:
...
Openmeetings安装 详细步骤 -
wwwqqqiang:
喜欢楼主分享问题的方式,有思想
UIView 和 CALayer的那点事
At a high level, the process for creating an iPhone application is similar to that for creating a Mac OS X application. Both use the same tools and many of the same basic libraries. Despite the similarities, there are also significant differences. An iPhone is not a desktop computer; it has a different purpose and requires a very different design approach. That approach needs to take advantage of the strengths of iPhone OS and forego features that might be irrelevant or impractical in a mobile environment. The smaller size of the iPhone and iPod touch screens also means that your application’s user interface should be well organized and always focused on the information the user needs most.
iPhone OS lets users interact with iPhone and iPod touch devices in ways that you cannot interact with desktop applications. The Multi-Touch interface reports on each separate finger that touches the screen and making it possible to handle multifinger gestures and other complex input easily. In addition, built-in hardware features such as the accelerometers, although present in some desktop systems, are used more extensively in iPhone OS to track the screen’s current orientation and adjust your content accordingly. Understanding how you can use these features in your applications will help you focus on a design that is right for your users.
The best way to understand the design of an iPhone application is to look at an example. This article takes you on a tour of the MoveMe sample application. This sample demonstrates many of the typical behaviors of an iPhone application, including:
-
Initializing the application
-
Displaying a window
-
Drawing custom content
-
Handling touch events
-
Performing animations
Figure 1 shows the interface for this application. Touching the Welcome button triggers an animation that causes the button to pulse and center itself under your finger. As you drag your finger around the screen, the button follows your finger. Lift your finger from the screen and, using another animation, the button snaps back to its original location. Double-tapping anywhere outside the button changes the language of the button’s greeting.
Figure 1 The MoveMe application window
Before reading the other sections of this article, you should download the sample (MoveMe ) so that you can follow along directly in the source code. You should also have already read the following orientation pages in the iPhone Dev Center to get a basic understanding of iPhone OS and the tools and language you use for development:
If you are not familiar with the Objective-C programming language, you should also have read <!-- a target="_top" -->Objective-C Primer<!-- /a--> to familiarize yourself with the basic syntax of Objective-C.
Examining the MoveMe Sample Project
Downloading the MoveMe
sample provides you with the source code and support files needed to
build and run the application. You manage projects for iPhone OS using
the Xcode application (located in /Developer/Applications
by default). Each Xcode project window combines a workspace for
gathering your code and resource files, build rules for compiling your
source and assembling your application, and tools for editing and
debugging your code.
Figure 2
shows the Xcode project window for the MoveMe application. To open this
project, copy it to your local hard drive and double-click the MoveMe.xcodeproj
file to open it. (You can also open the project from within Xcode by
selecting File > Open and choosing the file.) The project includes
several Objective-C source files (denoted by the .m
extension), some image files and other resources, and a predefined target (MoveMe
) for building the application bundle.
Figure 2 The MoveMe project window
In iPhone OS, the ultimate target of your Xcode project is an application bundle , which is a special type of directory that houses your application’s binary executable and supporting resource files. Bundles in iPhone OS have a relatively flat directory structure, with most files residing at the top level of the bundle directory. However, a bundle may also contain subdirectories to store localized versions of strings and other language-specific resource files. You do not need to know the exact structure of the application bundle for the purposes of this article, but you can find that information in “The Application Bundle” in iPhone Application Programming Guide if you are interested in it.
Building the MoveMe Application
To build the MoveMe application and run it in the simulator, do the following:
-
Open the
MoveMe.xcodeproj
file in Xcode. -
In the project toolbar, make sure the simulator option is selected in the Active SDK menu. (If the Active SDK menu does not appear in the toolbar, choose Project > Set Active SDK > Simulator.)
-
Select Build > Build and Go (Run) from the menu, or simply click the Build and Go button in the toolbar.
When the application finishes building, Xcode loads it into the iPhone simulator and launches it. Using your mouse, you can click the Welcome button and drag it around the screen to see the application’s behavior. If you have a device configured for development, you can also build your application and run it on that device. For information about how to configure devices for development and load applications, see iPhone Development Guide .
A Word About Memory Management
iPhone OS is primarily an object-oriented system, so most of the memory you allocate is in the form of Objective-C objects. iPhone OS uses a reference counting scheme to know when it is safe to free up the memory occupied by an object. When you first create an object, it starts off with a reference count of 1. Clients receiving that object can opt to retain it, thereby incrementing its reference count by 1. If a client retains an object, the client must also release that object when it is no longer needed. Releasing an object decrements its reference count by 1. When an object’s reference count equals 0, the system automatically reclaims the memory for the object.
Note: iPhone OS does not support memory management using the garbage collection feature that is in Mac OS X v10.5 and later.
If you want to allocate generic blocks of memory—that is, memory not associated with an object—you can do so using the standard malloc
library of calls. As is the case with any memory you allocate using malloc
, you are responsible for releasing that memory when you are done with it by calling the free
function. The system does not release malloc-based blocks for you.
Regardless of how you allocate memory, managing your overall memory usage is important. Although iPhone OS has a virtual memory system, it does not use a swap file. This means that code pages can be flushed as needed but your application’s data must all fit into memory at the same time. The system monitors the overall amount of free memory and does what it can to give your application the memory it needs. If memory usage becomes too critical though, the system may terminate your application. However, this option is used only as a last resort, to ensure that the system has enough memory to perform critical operations such as receiving phone calls.
For more information about how to allocate objects in iPhone OS, see Cocoa Fundamentals Guide . For information and tips on how to improve your application’s memory usage, see “Using Memory Efficiently” in iPhone Application Programming Guide .
Initializing the MoveMe Application
As is true for every C-based application, the initial entry point for every iPhone application is a function called main
.
The good news is that, when you create a new project using the iPhone
templates in Xcode, you do not have to write this function yourself.
The project templates include a version of this function with all the
code needed to start your application.
Listing 1
shows the main
function for the MoveMe application. The main function is located in that project’s main.m
file. Every application you create will have a main
function that is almost identical to this one. This function performs
two key tasks. First, it creates the application’s top-level
autorelease pool used by the memory management reference counting
system. Second, it calls the UIApplicationMain
function
to create the MoveMe application’s key objects, initialize those
objects, and start the event-processing loop. The application does not
return from this function until it quits.
Listing 1
Using the provided main
function
int main(int argc, char *argv[]) |
{ |
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; |
int retVal = UIApplicationMain(argc, argv, nil, nil); |
[pool release]; |
return retVal; |
} |
Defining the Application Delegate
One of the most important architectural details of your project is defining the application delegate
object, which is instantiated from a class you provide in your project.
The application delegate class in MoveMe project declares its interface
in MoveMeAppDelegate.h
and defines its implementation in MoveMeAppDelegate.m
.
Once you have added these files to the project, you can use Interface
Builder to designate an instance of the class as the application
delegate. Interface Builder is a visual tool that you use to create and
arrange views in a window, set up view hierarchies, configure each
view’s options, and establish relationships between the views and the
other objects of your application. Because it is a visual tool, you
perform all of these tasks by dragging components around a window
surface. The result is an interactive version of your interface that
you can see immediately and change in seconds. Interface Builder saves
your user interface in a file known as a nib file
, which is an archive of your application’s object graph.
To launch Interface Builder and see how the application delegate object’s role is defined, double-click the MainWindow.xib
file (under MoveMe > Resources) in the Groups & Files pane of the Xcode project window. MainWindow.xib
is the nib file that contains your application’s window and defines the
relationships among several important objects in your application,
including the application delegate. To see how the application delegate
relationship is established, click the File’s Owner icon in the nib
file document window (titled “MainWindow.xib”), show the Inspector
window (choose Tools > Inspector), and click the Inspector window’s
Application Connections tab. As shown in Figure 3
,
the Inspector shows that the File’s Owner object (which represents the
application in the nib file) has a delegate outlet connected to the MoveMeAppDelegate
object.
Figure 3 The application delegate
The application delegate object works in tandem with the standard UIApplication
object to respond to changing conditions in the application. The
application object does most of the heavy lifting, but the delegate is
responsible for several key behaviors, including the following:
-
Setting up the application’s window and initial user interface
-
Performing any additional initialization tasks needed for your custom data engine
-
Opening content associated with the application’s custom URL schemes
-
Responding to changes in the orientation of the device
-
Handling low-memory warnings
-
Handling system requests to quit the application
At launch time, the most immediate concern for the delegate object is to set up and present the application window to the user, which is described in “Creating the Application Window” . The delegate should also perform any tasks needed to prepare your application for immediate use, such as restoring the application to a previous state or creating any required objects. When the application quits, the delegate needs to perform an orderly shutdown of the application and save any state information needed for the next launch cycle.
For more information about the fundamental architecture and life cycle of an iPhone application, see “Core Application Architecture” in iPhone Application Programming Guide .
Creating the Application Window
Every
application is responsible for creating a window that spans the entire
screen and for filling that window with content. Graphical applications
running in iPhone OS do not run side-by-side with other applications.
In fact, other than the kernel and a few low-level system daemons, your
application is the only thing running after it is launched. What’s
more, your application should never need more than one window—an
instance of the UIWindow
class. In situations where you need to change your user interface, you change the views displayed by your window.
Windows
provide the drawing surface for your user interface, but view objects
provide the actual content. A view object is an instance of the UIView
class that draws some content and responds to interactions with that
content. iPhone OS defines standard views to represent things such as
tables, buttons, text fields, and other types of interactive controls.
You can add any of these views to your window, or you can define custom
views by subclassing UIView
and implementing some custom drawing and event-handling code. The MoveMe application defines two such views—represented by the MoveMeView
and PlacardView
classes—to display the application’s interface and handle user interactions.
At
launch time, the goal is to create the application window and display
some initial content as quickly as possible. The window is unarchived
from the MainWindow.xib
nib file. When the application reaches a state where it is launched and ready to start processing events, the UIApplication
object sends the delegate an applicationDidFinishLaunching:
message. This message is the delegate’s cue to put content in its
window and perform any other initialization the application might
require.
In the MoveMe application, the delegate’s applicationDidFinishLaunching:
method does the following:
-
It creates a view controller object whose job is to manage the content view of the window.
-
It initializes the view controller with an instance of the
MoveMeView
class, which is stored in theMoveMeView.xib
nib file, to act as the background view and fill the entire window frame. -
It adds the controller’s view as a subview of the window.
-
It shows the window.
Listing 2
shows the applicationDidFinishLaunching:
method for the MoveMe application, which is defined in the application delegate’s implementation file, MoveMeAppDelegate.m
.
This method creates the main content view for the window and makes the
window visible. Showing the window lets the system know that your
application is ready to begin handling events.
Listing 2 Creating the content view
- (void)applicationDidFinishLaunching:(UIApplication *)application |
{ |
// Set up the view controller |
UIViewController *aViewController = [[UIViewController alloc] |
initWithNibName:@"MoveMeView" bundle:[NSBundle mainBundle]]; |
self.viewController = aViewController; |
[aViewController release]; |
|
// Add the view controller's view as a subview of the window |
UIView *controllersView = [viewController view]; |
[window addSubview:controllersView]; |
[window makeKeyAndVisible]; |
} |
Note:
You can use the applicationDidFinishLaunching:
method to perform other tasks besides setting up your application user
interface. Many applications use it to initialize required data
structures, read any user preferences, or return the application to the
state it was in when it last quit.
Although the
preceding code creates the window's background view and then shows the
window, what you do not see in the preceding code is the creation of
the PlacardView
class that displays the Welcome button. That behavior is handled by the setUpPlacardView
method of the MoveMeView
class, which is called from the initWithCoder:
method called when the MoveMeView
object is unarchived from its nib file. The setUpPlacardView
method is shown in Listing 3
. Part of the initialization of this view includes the creation of a PlacardView
object. Because the MoveMeView
class provides the background for the entire application, it adds the PlacardView
object as a subview. The relationship between the two views not only
causes the Welcome button to be displayed on top of the application’s
background, it also allows the MoveMeView
class to handle events that are targeted at the button.
Listing 3 Creating the placard view
- (void)setUpPlacardView |
{ |
// Create the placard view -- it calculates its own frame based on its image. |
PlacardView *aPlacardView = [[PlacardView alloc] init]; |
self.placardView = aPlacardView; |
[aPlacardView release]; |
placardView.center = self.center; |
[self addSubview:placardView]; |
} |
For detailed information about creating windows and views, see “What Are Windows and Views?” in iPhone Application Programming Guide .
Drawing the Welcome Button
You
can use standard views provided by UIKit without modification to draw
many types of simple content. For example, you can use the UIImageView
class to display images and the UILabel
class to display text strings. The MoveMeView
class in the MoveMe application also takes advantage of a basic property of all UIView
objects—specifically, the backgroundColor
property—to fill the view with a solid color. This property can be set
in code in the view object’s initialization method. In this case, the
property is set when MoveMeView
is created in the MoveMeView.xib
nib file, using a color well in the Attributes tab of the Inspector
window of Interface Builder. When you need to draw content dynamically,
however, you must use the more advanced drawing features found in UIKit
or you must use Quartz or OpenGL ES.
The PlacardView
class in the MoveMe application draws the Welcome button and manages its location on the screen. Although the PlacardView
class could draw its content using an embedded UIImageView
and UILabel
object, it instead draws the content explicitly, to demonstrate the overall process. As a result, this class implements a drawRect:
method, which is where all custom drawing for a view takes place.
By the time a view’s drawRect:
method is called, the drawing environment is configured and ready to
go. All you have to do is specify the drawing commands to draw any
custom content. In the PlacardView
class, the content consists of a background image (stored in the Placard.png
resource file) and a custom string, the text for which can change
dynamically. To draw this content, the class takes the following steps:
-
Draw the background image at the view’s current origin. (Because the view is already sized to fit the image, this step provides the entire button background.)
-
Compute the position of the welcome string so that it is centered in the button. (Because the string size can change, the position needs to be computed each time based on the current string size.)
-
Set the drawing color to black.
-
Draw the string in black, and slightly offset.
-
Set the drawing color to white.
-
Draw the string again in white at its intended location.
Listing 4
shows the drawRect:
method for the PlacardView
class. The placardImage
member variable contains a UIImage
object with the background for the button and the currentDisplayString
member variable is an NSString
object containing the welcome string. After drawing the image, this
method calculates the position of the string within the view. The size
of the string is already known, having been calculated when the string
was loaded and stored in the textSize
member variable. The string is then drawn twice—once in black and once in white—using the drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:
method of NSString
.
Listing 4 Drawing the Welcome button
- (void)drawRect:(CGRect)rect |
{ |
// Draw the placard at 0, 0 |
[placardImage drawAtPoint:(CGPointMake(0.0, 0.0))]; |
|
/* |
Draw the current display string. |
This could be done using a UILabel, but this serves to illustrate |
the UIKit extensions to NSString. The text is drawn center of the |
view twice - first slightly offset in black, then in white -- to give |
an embossed appearance. The size of the font and text are calculated |
in setupNextDisplayString. |
*/ |
|
// Find point at which to draw the string so it will be in the center of the view |
CGFloat x = self.bounds.size.width/2 - textSize.width/2; |
CGFloat y = self.bounds.size.height/2 - textSize.height/2; |
CGPoint point; |
|
// Get the font of the appropriate size |
UIFont *font = [UIFont systemFontOfSize:fontSize]; |
|
[[UIColor blackColor] set]; |
point = CGPointMake(x, y + 0.5); |
[currentDisplayString drawAtPoint:point |
forWidth:(self.bounds.size.width-STRING_INDENT) |
withFont:font |
fontSize:fontSize |
lineBreakMode:UILineBreakModeMiddleTruncation |
baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; |
|
[[UIColor whiteColor] set]; |
point = CGPointMake(x, y); |
[currentDisplayString drawAtPoint:point |
forWidth:(self.bounds.size.width-STRING_INDENT) |
withFont:font |
fontSize:fontSize |
lineBreakMode:UILineBreakModeMiddleTruncation |
baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; |
} |
When
you need to draw content that is more complex than images and strings,
you can use Quartz or OpenGL ES. Quartz works with UIKit to handle the
drawing of vector-based paths, images, gradients, PDF, and other
complex content that you want to create dynamically. Because Quartz and
UIKit are based on the same drawing environment, you can call Quartz
functions directly from the drawRect:
method of your view and even mix and match Quartz calls through the use of UIKit classes.
OpenGL
ES is an alternative to Quartz and UIKit that lets you render 2D and 3D
content using a set of functions that resemble (but are not exactly
like) those found in OpenGL for Mac OS X. Unlike Quartz and UIKit, you
do not use your view’s drawRect:
method to do your
drawing. You still use a view, but you use that view object primarily
to provide the drawing surface for your OpenGL ES code. How often you
update the drawing surface, and which objects you use to do so, are
your decision.
For detailed information about each of the drawing technologies and how you use them, see Graphics and Drawing in iPhone Application Programming Guide .
Handling Touch Events
The Multi-Touch interface in iPhone OS makes it possible for your application to recognize and respond to distinct events generated by multiple fingers touching the device. The ability to respond to multiple fingers offers considerable power but represents a significant departure from the way traditional, mouse-based event-handling systems operate. As each finger touches the surface of the device, the touch sensor generates a new touch event. As each finger moves, additional touch events are generated to indicate the finger’s new position. When a finger loses contact with the device surface, the system delivers yet another touch event to indicate that fact.
Because there may be multiple fingers touching the device at one time, it is possible for you to use those events to identify complex user gestures. The system provides some help in detecting common gestures such as swipes, but you are responsible for detecting more complex gestures. When the event system generates a new touch event, it includes information about the current state of each finger that is either touching or was just removed from the surface of the device. Because each event object contains information about all active touches, you can monitor the actions of each finger with the arrival of each new event. You can then track the movements of each finger from event to event to detect gestures, which you can apply to the contents of your application. For example, if the events indicate the user is performing a pinch-close or pinch-open gesture (as shown in Figure 4 ) and the underlying view supports magnification, you could use those events to change the current zoom level.
Figure 4 Using touch events to detect gestures
The system delivers events to the application’s responder objects, which are instances of the UIResponder
class. In an iPhone application, your application’s views form the bulk
of your custom responder objects. The MoveMe application implements two
view classes, but only the MoveMeView
class actually
responds to event messages. This class detects taps both inside and
outside the bounds of the Welcome button by overriding the following
methods of UIResponder
:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; |
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; |
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; |
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; |
To
simplify its own event-handling behavior, the MoveMe application tracks
only the first finger to touch the surface of the device. It does this
with the support of the UIView
class, which disables
multi-touch events by default. For applications that do not need to
track multiple fingers, this feature is a great convenience. When
multi-touch events are disabled, the system delivers events only
related to the first finger to touch the device. Events related to
additional touches in a sequence are never delivered to the view. If
you want the information for those additional touches, however, you can
reenable multi-touch support using the setMultipleTouchEnabled:
method of the UIView
class.
As part of its event-handling behavior, the MoveMeView
class performs the following steps:
-
When a touch first arrives, it checks to see where the event occurred.
-
Double-taps outside the Welcome button update the string displayed by the button.
-
Single taps inside the button center the button underneath the finger and trigger an initial animation to enlarge the button.
-
All other touches are ignored.
-
-
If the finger moves and is inside the button, the button’s position is updated to match the new position of the finger.
-
If the finger was inside the button and then lifts off the surface of the device, an animation moves the button back to its original position.
Listing 5
shows the touchesBegan:withEvent:
method for the MoveMeView
class. The system calls this method when a finger first touches the
device. This method gets the set of all touches and extracts the one
and only touch object from it. The information in the UITouch
object is used to identify in which view the touch occurred (the MoveMeView
object or the PlacardView
object) and the number of taps associated with the touch. If the touch represents a double tap outside the button, the touchesBegan:withEvent:
method calls the setupNextDisplayString
method to change the welcome string of the button. If the event occurred inside the Welcome button, it uses the animateFirstTouchAtPoint:
method to grow the button and track it to the touch location. All other touch-related events are ignored.
Listing 5 Handling an initial touch event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
// We only support single touches, so anyObject |
// retrieves just that touch from touches |
UITouch *touch = [touches anyObject]; |
|
// Only move the placard view if the touch was in the placard view |
if ([touch view] != placardView) |
{ |
// In case of a double tap outside the placard view, |
// update the placard's display string |
if ([touch tapCount] == 2) |
{ |
[placardView setupNextDisplayString]; |
} |
return; |
} |
// Animate the first touch |
CGPoint touchPoint = [touch locationInView:self]; |
[self animateFirstTouchAtPoint:touchPoint]; |
} |
Listing 6
shows the touchesMoved:withEvent:
method of the MoveMeView
class. The system calls this method after the finger has touched the
device and in response to it moving from its original location. The
MoveMe application tracks only those movements that occur within the
Welcome button. As a result, this method checks the location of the
event and uses it to adjust the center point of the PlacardView
object. The movement of the view causes it to be redrawn at the new location automatically.
Listing 6 Responding to movement from a touch
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
UITouch *touch = [touches anyObject]; |
|
// If the touch was in the placardView, move the placardView |
// to its location |
if ([touch view] == placardView) |
{ |
CGPoint location = [touch locationInView:self]; |
placardView.center = location; |
return; |
} |
} |
When
the user’s finger finally lifts from the screen, the MoveMe application
responds by triggering an animation to move the button back to its
starting position in the center of the application’s window. Listing 7
shows the touchesEnded:withEvent:
method that initiates the animation.
Listing 7 Releasing the Welcome button
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
UITouch *touch = [touches anyObject]; |
|
// If the touch was in the placardView, bounce it back to the center |
if ([touch view] == placardView) |
{ |
// Disable user interaction so subsequent touches |
// don't interfere with animation |
self.userInteractionEnabled = NO; |
[self animatePlacardViewToCenter]; |
return; |
} |
} |
To simplify the event handling process for the application, the touchesEnded:withEvent:
method disables touch events for the view temporarily while the button
animates back to its original position. If it did not do this, each of
the event-handling methods would need to include logic to determine
whether the button was in the middle of an animation and, if so, cancel
the animation. Disabling user interactions for the short time it takes
the button to travel back to the center of the screen simplifies the
event handling code and eliminates the need for the extra logic. Upon
reaching its original position, the animationDidStop:finished:
method of the MoveMeView
class reenables user interactions so that the event cycle can begin all over again.
If the application is interrupted for some reason—for example, by an incoming phone call—the view is sent a touchesCancelled:withEvent:
message. In this situation, the application should try to do as little
work as possible to avoid competing for device resources. In the
example implementation, the placard view’s center and transformation
are simply set to their original values.
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { |
placardView.center = self.center; |
placardView.transform = CGAffineTransformIdentity; |
} |
|
For more information on handling events in iPhone OS, see Event Handling in iPhone Application Programming Guide .
Animating the Button’s Movement
In iPhone applications, animation plays a very important role. Animation is used extensively to provide the user with contextual information and immediate feedback. For example, when the user navigates hierarchical data in a productivity application, rather than just replace one screen with another, iPhone applications animate the movement of each new screen into place. The direction of movement indicates whether the user is moving up or down in the hierarchy and also provides a visual cue that there is new information to look at.
Because of its importance, support for animation is built into the classes of UIKit already. The MoveMe application takes advantage of this support by using it to animate the different aspects of the Welcome button. When the user first touches the button, the application applies an animation that causes the size of the button to grow briefly. When the user lets go of the button, another animation snaps it back to its original position. The basic steps for creating these animations are essentially the same:
-
Call the
beginAnimations:context:
method of the view you want to animate. -
Configure the animation properties.
-
Call the
commitAnimations
method of the view to begin the animation.
Listing 8
shows the animation code used to pulse the Welcome button when it is
first touched. This method sets the duration of the animation and then
applies a transform to the button that scales it to its new size. When
this animation completes, the animation infrastructure calls the growAnimationDidStop:finished:context:
method of the animation delegate, which completes the pulse animation
by shrinking the button slightly and moving the placard view under the
touch.
Listing 8 Animating the Welcome button
- (void)animateFirstTouchAtPoint:(CGPoint)touchPoint |
{ |
#define GROW_ANIMATION_DURATION_SECONDS 0.15 |
|
NSValue *touchPointValue = [[NSValue valueWithCGPoint:touchPoint] retain]; |
[UIView beginAnimations:nil context:touchPointValue]; |
[UIView setAnimationDuration:GROW_ANIMATION_DURATION_SECONDS]; |
[UIView setAnimationDelegate:self]; |
[UIView setAnimationDidStopSelector: @selector(growAnimationDidStop:finished:context:)]; |
CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2); |
placardView.transform = transform; |
[UIView commitAnimations]; |
} |
|
- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context |
{ |
#define MOVE_ANIMATION_DURATION_SECONDS 0.15 |
|
[UIView beginAnimations:nil context:NULL]; |
[UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS]; |
placardView.transform = CGAffineTransformMakeScale(1.1, 1.1); |
|
// Move the placard view under the touch |
NSValue *touchPointValue = (NSValue *)context; |
placardView.center = [touchPointValue CGPointValue]; |
[touchPointValue release]; |
[UIView commitAnimations]; |
} |
For more information about using the built-in view-based animations, see “Animating Views” in iPhone Application Programming Guide . For more information about Core Animation, see “Applying Core Animation Effects” in iPhone Application Programming Guide .
Finishing the Application
In
the preceding sections, you saw how the MoveMe application was
initialized, presented its user interface, and responded to events. In
addition to those aspects of the application creation, there are also
smaller details that need to be considered before building an
application and loading it onto a device. One of the final pieces to
put in place is your application’s information property-list (Info.plist
)
file. It is an XML file that communicates basic information about your
application to the system. Xcode creates a default version of this file
for you and inserts your application’s initial configuration
information into it. You can extend this information, however, to
provide additional details about your application that the system
should know. For example, you would use this file to communicate
information about your application version, any custom URL schemes it
supports, its launch image, and the default visibility status and style
of the system status bar.
Listing 9
shows the contents of the Info.plist
file for the MoveMe application. This file identifies the name of the
executable, the image file to display on the user’s Home screen, and
the string that identifies the application uniquely to the system.
Because the MoveMe application is a full-screen application—in other
words, it does not display the status bar—it also includes the UIStatusBarHidden
key and assigns to it the value true
. Setting this key to true
lets the system know that it should not display the application status
bar at launch time or while the application is running. Although the
MoveMe application could configure this same behavior programmatically,
that behavior would not take effect until after the application was
already launched, which might look odd.
Listing 9
The contents of the Info.plist
file
<?xml version="1.0" encoding="UTF-8"?> |
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" |
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
<plist version="1.0"> |
<dict> |
<key>CFBundleDevelopmentRegion</key> |
<string>en</string> |
<key>CFBundleDisplayName</key> |
<string>${PRODUCT_NAME}</string> |
<key>CFBundleExecutable</key> |
<string>${EXECUTABLE_NAME}</string> |
<key>CFBundleIconFile</key> |
<string>Icon.png</string> |
<key>CFBundleIdentifier</key> |
<string>com.yourcompany.${PRODUCT_NAME:identifier}</string> |
<key>CFBundleInfoDictionaryVersion</key> |
<string>6.0</string> |
<key>CFBundleName</key> |
<string>${PRODUCT_NAME}</string> |
<key>CFBundlePackageType</key> |
<string>APPL</string> |
<key>CFBundleSignature</key> |
<string>????</string> |
<key>CFBundleVersion</key> |
<string>1.0</string> |
<key>UIStatusBarHidden</key> |
<true/> |
<key>NSMainNibFile</key> |
<string>MainWindow</string> |
</dict> |
</plist> |
Note:
You can edit the contents of your application’s Info.plist
file using TextEdit, which displays the XML contents of the file as shown in Listing 9
,
or the Property List Editor, which displays the file’s keys and values
in a table. Xcode also provides access to some of these attributes in
the information window for your application target. To view this
window, select your application target (in the Targets group) and
choose File > Get Info. The Properties tab contains some (but not
all) of the properties in the Info.plist
file.
For information about configuring your application’s Info.plist
file, see “The Information Property List”
in iPhone Application Programming Guide
.
With this final piece in place, you now have all of the basic information needed to create your own functional iPhone application. The next step is to expand on the information you learned here by learning more about the features of iPhone OS. The applications you create should take advantage of the built-in features of iPhone OS to create a pleasant and intuitive user experience. Some of these features are described in “Taking Your Applications Further” , but for a complete list, and for information on how to use them, see iPhone Application Programming Guide .
Taking Your Applications Further
There are many features associated with iPhone and iPod touch that users take for granted. Some of these features are hardware related, such as the automatic adjustment of views in res
发表评论
-
iOS 自定义UIActionSheet
2012-12-18 16:07 16423一:模态视图 UIActi ... -
UIView 和 CALayer的那点事
2012-11-17 23:51 30780UIView 和 CALayer的那点事 (1 ... -
iOS Open Source : Popover API for iPhone
2012-01-20 15:02 1948http://iphonedevelopertips.com/ ... -
ios 任务、线程、定时器
2011-12-26 18:09 8032一:operations(任务) cocoa提供了三种 ... -
ios url缓存策略——NSURLCache、 NSURLRequest
2011-12-26 17:09 24360一:url 缓存策略 NSURLRequest ... -
ios NSInvocation简单使用
2011-12-22 16:39 6379在ios直接调用某个对象的消息是方法有两种: 一:perfo ... -
iphone 对Web Services的三种请求方式soap get post
2011-11-09 10:57 6444一:Using SO AP 1.1 POST / ... -
sdk3.2手势实例
2011-11-09 10:11 1746#import <UIKit/UIKit.h>@i ... -
关于iphone 利用hpple解析html的问题
2011-08-04 18:28 2229最近在用happe解析html中的图片。有个翻页操作,如果请 ... -
iphone hpple 解析html,xml
2011-07-19 16:21 2755使用Objective-C解析HTML或者XML,系统自带有两 ... -
激活 iPhone通过 GPRS 连接服务器功能的代码
2011-05-13 15:14 1663如果您的 iPhone 应用里含有连接服务器的功能,也许会遇到 ... -
address book api 图型
2011-04-28 15:51 1151最近要搞地址簿了,整理一下 -
[OmniGraffle]iPhone app原型制作工具
2011-04-06 17:35 3962在写程序之前,我们通常需要做一些mockup出来(不知道款爷有 ... -
自定义uislider 样式
2011-04-04 21:28 3844UIImage *stetchLeftTrack= [[UII ... -
iphone 下AsyncSocket网络库编程
2011-04-02 21:04 7647iphone的标准推荐CFNetwork ... -
进阶AlertView运用 - 登入设计
2011-04-01 17:52 3043说明:示范如何利用AlertView来制作系统登入的介面程式碼 ... -
iPad UIPopoverController弹出窗口的位置和坐标
2011-04-01 17:42 2008优化规则: TodoViewControlle ... -
iPhone系统自动化测试
2011-04-01 17:39 2624首先mac系统是必备的2 安装iPhone SD ... -
iphone上面编写具有root权限的程序
2011-04-01 17:31 6302正常途径下, 我们编写的程序发布在App store上, 使用 ... -
聊天。。。。。
2011-04-01 17:13 1095是得分手段
相关推荐
iOS 10 SDK Development: Creating iPhone and iPad Apps with Swift by Chris Adamson English | 24 Mar. 2017 | ASIN: B071RRCK9R | 264 Pages | AZW3 | 5.24 MB All in on Swift! iOS 10 and Xcode 8 make it ...
Chapter 9: Creating an Audio-Centric App for the iPhone with AVAudioPlayer Chapter 10: Implementing Push Notifications at eBuddy amazon link:...
The main objective of this assignment is to reproduce the demonstration given in class, which involves building a simple calculator application for the iPhone. This assignment aims to help students ...
So how do you build an application for the iPhone and iPad? Don’t you need to spend years learning complicated programming languages? What about Objective-C and Cocoa touch? The answer is that you ...
Written by an experienced Apple developer and trainer, this full–color reference serves as an ideal jumping point for creating applications for Apple’s iOS 4 that runs on the iPhone, iPod Touch, and...
The unprecedented success of iPhone and iPod touch serves as proof positive that application developers are entering uncharted territory when it comes to creating sophisticated, multi-functional ...
The "iOS Application Programming Guide" is a comprehensive resource designed to help developers create applications for Apple's iOS platform, including the iPhone, iPad, and iPod touch. It covers a ...
iOS 8 App Development Essentials takes a modular approach to the subject of iOS 8 application development for both the iPhone and iPad, with each chapter covering a self contained topic area ...
Cocoa programming is not only the favored development environment for Mac OS X, it’s also a primary tool for creating iPhone and iPod Touch software. That makes this a great time to learn Cocoa, and ...
"Objective-C for Absolute Beginners: iPhone and Mac Programming Made Easy" is an excellent resource for those starting out in the world of software development for Apple platforms. The book covers ...
This quick-start guide will have you writing iPad apps right away using a combination of the familiar iPhone APIs along with the new APIs and additional templates designed specifically for creating ...
A second appendix provides a significant game-oriented Java application, which you can convert into an Android app. Once you complete this one-of-a-kind book written by Jeff Friesen, an expert Java ...
A second appendix provides a significant game-oriented Java application, which you can convert into an Android app. Once you complete this one-of-a-kind book written by Jeff Friesen, an expert Java ...
### Core Animation Guide for iOS and iPhone #### Introduction to Core Animation Core Animation is an advanced graphics and animation framework developed by Apple. It plays a crucial role in the ...