⬆️ ⬇️

Decorator (Translation from the English chapter "Decorator" from the book "Pro Objective-C Design Patterns for iOS" by Carlo Chung)

Usually, when taking photographs, you do not think about how to decorate them later. You are taking pictures simply because you want to catch the moment. For example, you then printed one of the photos, then decided to put it in a frame with unusual glass. But later you could put the same photo in a different frame, if you wanted. Even though you changed the frame, the picture remained the same, because you just added something to it, but did not change it.



In object-oriented programming, we borrowed a similar idea of ​​adding behavior to other objects without losing their original features, i.e., an extended object would be an improved version of the same class (photo in frame). Any β€œenhancement” (frame) can be applied and removed dynamically. We call this design pattern the Decorator, since the decorator can be added to another decorator or source object to extend its properties, leaving the original behavior intact.



In this chapter, we first discuss the concept of the pattern and when to use it. Then we will discuss how to take advantage of this pattern to design a series of filtering class images for UIImage objects.

')

What is a decorator pattern?



The Classic Decorator pattern contains the parent Abstract Component , which declares some common operations for other specific components. The abstract Component class can be wrapped in another Decorator class. Decorator contains a link to another Component . ConcreteDecorator defines some extended behavior for other similar Component and Decorator and performs the operation of the Component object included in it. Their relationship is illustrated in Figure 16-1.



image



Figure 16–1. Class diagram of the Decorator pattern



The Component class defines an abstract operation method that its concrete classes override to have their own specific operations. Decorator is a base class that defines β€œdecorating” behavior to extend other instances of the Component (or Decorator ) by including it in the Decorator object. His default operation method simply forwards the message to the included component . ConcreteDecoratorA and ConcreteDecoratorB override the parent operation to add their own behavior to the call to the operation component method using super . If you only need to extend the component once, then you can ignore the base Decorator class and allow ConcreteDecorator redirect any requests directly to the component . This is similar to chaining with the addition of one behavior on top of another, as illustrated in the object diagram in Figure 16-2.



image



Figure 16–2. Implementation of the Decorator pattern and its functionality



Note. Pattern Decorator : Adds additional features to an object dynamically. Decorators provide a flexible alternative to inheritance to extend functionality. *



* The original definition given in GoF’s Design Patterns (Addison Wesley, 1994).



When could you use the Decorator pattern?



There are three common situations in which you might consider using this pattern:





The change in the "skin" of an object in comparison with the change in "viscera



In the previous section, we discussed how different decorators can be connected at runtime by using an internal embedded component at each decorator node, as shown in Figure 16–2. It is also illustrated here that each decorator changes its embedded component from the outside, that is, it simply changes the shell of the object. The idea is that the node does not know that it is changing.



However, when each node knows about other nodes, the chain will be built in a different direction, that is, from the inside. Such a pattern is called Strategy (see chapter 19). Each node needs to contain a set of different APIs to connect to another strategy node. A visual representation of this concept is shown in Figure 16–3.



image



Figure 16–3. Changing the "internals" of objects using the Strategy pattern



The final differences between the β€œskinning” (decorators) and β€œviscera” (strategy) changes of the object are shown in Table 16-1.



Table 16-1. Summary table of differences between decorators and strategies

Change "skins" (Decorators)Changing the "entrails" (Strategies)
Changes outsideChanges from the inside
Separate node not aware of changesThe individual node knows the predefined change capabilities.


Creating filters for UIImage images



Image filtering is the process by which we can change image attributes, such as colors and geometry. We can have a filter that can change the hue of the image, or a Gaussian filter to darken it, so that it looks as if it is out of focus. We can even apply a kind of 2D transformation to it so that it does not look flat on the surface. There are many various filters that we can use to impose some β€œspecial effects” on the image. Many photo editors, such as Photoshop and GIMP, come with a large number of filters. What does the image filter use first with the Decorator pattern?



The Decorator pattern is a method of adding a new behavior to an object without changing the existing behavior and interface. Let's say an image object contains only an interface for managing attributes and nothing more. We want to add something unusual to it, such as a transforming filter, but we don’t want to modify the existing interfaces that the image object already has. What we can do is define another class that is the same as the image object, but contains a link to another image object whose behavior needs to be expanded. The new class contains a method for drawing itself in a graphic context. In his drawing method, he applies the transform algorithm to the included image link, draws the entire picture, and returns the resulting image. You can illustrate this process as the imposition of another layer of glass on top of the picture. The image does not need to know anything about the glass, and when we look at it, we still consider it a picture. The glass itself may have some kind of color, a wavy structure on the surface, or something else, so that the image looks different. If we later want to apply another layer or filter to an image, then we can define another filter class, as in the case of transformation, with which we can use the same mechanism to change the image. Other filters after transformation can pick up the resulting image and continue the process. However, one thing is important to note - the image transmitted through the chain of filters does not have to be always the original, but it must be of the same type. The image returned after the transformation filter is a transformed image. Then, when it is transferred to the color filter, the returned image will be with the changed color and transformed, etc.



UIImage in UIKit from the Cocoa Touch framework represents image objects. The UIImage class UIImage has a rather limited interface for image manipulation. There is nothing but a few properties of the image, such as size, color, etc. We will extend the usual image object with some of the features available in the Quartz 2D framework. There are two approaches for the implementation of the pattern - subclasses and categories.



Implementing Decorators via Subclasses


In the case of a subclass-based approach, the structure will be similar to the original style of the pattern shown in Figure 16-1. The only difference is that the final type of the element is the UIImage category, not its subclass. There is one structural problem that UIImage us from sharing the same interface that a UIImage implements. UIImage is a direct descendant of NSObject and no more. This is a kind of final class. To use some sort of β€œ Component ” interface (like the parent interface in the class diagram in Figure 16-1), in order to combine both UIImage and filter classes together, we need a workaround. Now we have two problems:







What are we going to do? First of all, of course, we need an interface for separating a UIImage with a group of filter classes in order for this pattern to work and for both types of classes to share the same basic type. The idea of ​​using UIImage as a high-level type for this purpose (that is, inheriting from it) is bad, because then the filters will be difficult to use. We create the ImageComponent interface in the form of a protocol as the optimal base type for all. But wait a minute; have we not mentioned that UIImage does not inherit from any interface, but simply directly inherits NSObject ? Yes it is - this is where we need a creative solution. We will create a UIImage category that implements the ImageComponent . Then the compiler will know that UIImage and ImageComponent are relatives, and will not swear. UIImage is not even aware that it now has a new base type. Only those who will use filters need to know about it.



Also, we are not going to bother with the original draw* methods defined in the UIImage , but how then will we expand the possibilities of drawing in another ImageComponent ? We will come to this soon.



The class diagram, which shows their relationships, is shown in Figure 16-4.



image



Figure 16–4. A class diagram of various image filters that implement the Decorator pattern



The ImageComponent protocol defines an abstract interface with all draw* methods from the UIImage class. Any particular ImageComponent and similar decorators should be able to handle these calls. The draw* message for a UIImage instance will allow it to draw its contents in the current graphics context. Each of the methods can also create transformations and other effects in this context. That way, we can inject our own filtering before any draw* operation.



Our specific component here is a UIImage type, but we don’t want to create its subclass just to make it part of the game, so we define a category for it. The UIImage (ImageComponent) category UIImage (ImageComponent) implements the ImageComponent protocol. Since all the methods declared in the protocol are already in the UIImage class, we do not need to implement them in the category. The category basically does nothing, but only informs the compiler that this is also a kind of ImageComponent .



ImageFilter is like the Decorator class in Figure 16-1. The apply method of the ImageFilter class allows specific filter classes to add additional behavior to the base component_ . Instead of overriding all draw* methods to implement filter actions, we use a single method (id) forwardingTargetForSelector:(SEL)aSelector to process them all. forwardingTargetForSelector: defined in the NSObject class, which allows subclasses to return an alternate recipient to call the aSelector selector. The ImageFilter instance ImageFilter first check if aSelector some of the draw* messages. If so, it will send itself a apply message to introduce additional behavior before returning component_ to invoke default actions. The default implementation of the apply method does nothing. Missing information must be provided by subclasses. This approach is much simpler than if each filter class would implement the same mechanism for extending behavior.



Both ImageTransformFilter and ImageShadowFilter focus on providing their own filtering algorithms by overriding the apply method. They inherit from the base ImageFilter class, which has a link to another ImageComponent in the form of a private variable component_ . Various ImageComponent objects can be connected at run time, as shown in Figure 16-5.



image



Figure 16-5. An object diagram showing that each ImageComponent is referenced in another ImageComponent instance at each level.



The right end of this chain is the source image, which is shown on the left in Figure 16-6. After we add it to anImageTransformFilter , and then add anImageTransformFilter to anImageShadowFilter , the client will get something like the right image in Figure 16-6. Each node is encapsulated as a component_ another ImageComponent instance. An analogy can be drawn with how a larger fish swallows smaller ones. Obviously, the client does not know any details of the decorators, but simply receives a link to an instance of the same old UIImage type (in the form of ImageComponent , because UIImage implements the ImageComponent through a category).



image



Figure 16-6. Original image and the same image after applying a series of filters



It is exciting. Let's see how you can jot it down in code. The first thing we look at is the ImageComponent , which is declared as a protocol in Listing 16-1.



Listing 16–1. ImageComponent.h

 @protocol ImageComponent <NSObject> //     //  UIImage   //   @optional - (void) drawAsPatternInRect:(CGRect)rect; - (void) drawAtPoint:(CGPoint)point; - (void) drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha; - (void) drawInRect:(CGRect)rect; - (void) drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha; @end 




All draw* methods are declared as @optional , since we want every ImageComponent to support these operations, but do not actually redefine them in the implementing classes. The @optional notifies the compiler that the corresponding method implementations may be missing.



Listing 16–2 contains a category declaration for a UIImage , which we can use with other decorators later.



Listing 16–2. UIImage + ImageComponent.h

 #import "ImageComponent.h" @interface UIImage (ImageComponent) <ImageComponent> @end 




It (category) implements the ImageComponent protocol without any real implementation. Now we turn to our main decorator class - ImageFilter . His ad is shown in Listing 16–3.



Listing 16–3. ImageFilter.h

 #import "ImageComponent.h" #import "UIImage+ImageComponent.h" @interface ImageFilter : NSObject <ImageComponent> { @private id <ImageComponent> component_; } @property (nonatomic, retain) id <ImageComponent> component; - (void) apply; - (id) initWithImageComponent:(id <ImageComponent>) component; - (id) forwardingTargetForSelector:(SEL)aSelector; @end 




It contains a link to the ImageComponent as component_ , which can be decorated with any other specific decorators. ImageFilter overrides forwardingTargetForSelector: and declares apply . The implementation of the class is shown in Listing 16-4.



Listing 16–4. ImageFilter.m

 #import "ImageFilter.h" @implementation ImageFilter @synthesize component=component_; - (id) initWithImageComponent:(id <ImageComponent>) component { if (self = [super init]) { //  ImageComponent [self setComponent:component]; } return self; } - (void) apply { //     //     } - (id) forwardingTargetForSelector:(SEL)aSelector { NSString *selectorName = NSStringFromSelector(aSelector); if ([selectorName hasPrefix:@"draw"]) { [self apply]; } return component_; } @end 




The initWithImageComponent: method does not much useful initWithImageComponent: It simply assigns a link to the ImageComponent from the method parameter to itself. Also, his apply method doesn't do anything in this case until we see it again in specific filter classes.



What is interesting here is that we use forwardingTargetForSelector: to intercept calls to messages that the ImageFilter instance ImageFilter not know how to handle. This method allows subclasses to send another recipient's runtime so that the original message will be forwarded. But we are only interested in everything that has the prefix @β€œdraw” , and then we redirect everything else directly to component_ , returning it to the execution environment. For example, when a drawAtRect: message drawAtRect: sent to an ImageFilter instance, it will be intercepted in the forwardingTargetForSelector: method, waiting for an alternate recipient because ImageFilter has no implementation for this. Since the message contains the prefix β€œdraw”, the method sends a message to apply to do something before the component_ processes the message later.



Now we can get a few real filters. The first one we are going to create is ImageTransformFilter, as shown in Listing 16-5.



Listing 16-5. ImageTransformFilter.h

 #import "ImageFilter.h" @interface ImageTransformFilter : ImageFilter { @private CGAffineTransform transform_; } @property (nonatomic, assign) CGAffineTransform transform; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform; - (void) apply; @end 




ImageTransformFilter is a subclass of ImageFilter and overrides the apply method. It also declares the transform_ private variable of type CGAffineTransform with its associated property to access it. Since CGAffineTransform is a C structure, the property must be of the type to be assigned, since its value cannot be called retain like other Objective-C objects. The filter has its own initialization method. The initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     16–6. 
    



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .
initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .

initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .

initWithImageComponent:(id )component transform: (CGAffineTransform)tranform ImageComponent CGAffineTransform . component initWithComponent: super , transform , 16–6.



16–6. ImageTransformFilter.m

@implementation ImageTransformFilter @synthesize transform=transform_; - (id) initWithImageComponent:(id <ImageComponent>)component transform:(CGAffineTransform)transform { if (self = [super initWithImageComponent:component]) { [self setTransform:transform]; } return self; } - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGContextConcatCTM(context, transform_); } @end



apply CGContextRef Quartz 2D UIGraphicsGetCurrentContext() . Quartz 2D . , transform_ CGContextConcatCTM() . , CGAffineTransform . .



ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 16–7, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 16–6.



16–7. ImageShadowFilter.m

#import "ImageShadowFilter.h" @implementation ImageShadowFilter - (void) apply { CGContextRef context = UIGraphicsGetCurrentContext(); // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); } @end



. - DecoratorViewController , viewDidLoad , 16–8.



16–8. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , id <ImageComponent> transformedImage = [[[ImageTransformFilter alloc] initWithImageComponent:image transform:finalTransform] autorelease]; id <ImageComponent> finalImage = [[[ImageShadowFilter alloc] initWithImageComponent:transformedImage] autorelease]; // DecoratorView // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, 16–6. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 16–9.



16–9. drawRect:rect DecoratorView.m

- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }



DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 16–6.



: .



, , . , .





, , UIImage , UIImage , . Objective-C. , - 2D- , – . , , 16–7.



image



16–7. , UIImage



, . - UIImage (BaseFilter) , UIImage (Transform) UIImage (Shadow) . BaseFilter , Transform Shadow . BaseFilter 2D , , ImageFilter . . Transform , Shadow BaseFilter , , – UIImage . , BaseFilter , Transform Shadow , , . Transform imageWithTransform:transform , ( ), , , . Shadow imageWithDropShadow , . , , , , . , , 16–8.



image



16–8. , - UIImage



– , , 16–6. Shadow Transform , , , - 16–6. , , self component_ .



. BaseFilter , , , 16–10.



16–10. UIImage+BaseFilter.h

@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end



BaseFilter , , 16–11.



16–11. UIImage+BaseFilter.m

#import "UIImage+BaseFilter.h" @implementation UIImage (BaseFilter) - (CGContextRef) beginContext { // // iOS 4 UIGraphicsBeginImageContextWithOptions // // iOS UIGraphicsBeginImageContext CGSize size = [self size]; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(size, NO, 0); else UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); return context; } - (UIImage *) getImageFromCurrentImageContext { [self drawAtPoint:CGPointZero]; // UIImage UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext(); return imageOut; } - (void) endContext { UIGraphicsEndImageContext(); } @end



beginContext – , . . , .



getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .



endContext Quartz 2D UIGraphicsEndImageContext() - .



. , , - Transform . Transform , CGAffineTransform . 16–12.



16–12. UIImage+Transform.h

@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end



, 16–13.



16–13. UIImage+Transform.m

#import "UIImage+Transform.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform { CGContextRef context = [self beginContext]; // CGContextConcatCTM(context, transform); // UIImage *imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



CGAffineTransform , . transform Quartz 2D, CGContextConcatCTM(context, transform) . transform . self getImageFromCurrentImageContext , BaseFilter . , UIImage , endContext , , .



Transform . , ? Shadow , , 16–14.



16–14. UIImage+Shadow.h

@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end



, Transform , Shadow – UIImage , . , , Transform . , 16–15.



16–15. UIImage+Shadow.m

#import "UIImage+Shadow.h" #import "UIImage+BaseFilter.h" @implementation UIImage (Shadow) - (UIImage *) imageWithDropShadow { CGContextRef context = [self beginContext]; // CGSize offset = CGSizeMake (-25, 15); CGContextSetShadow(context, offset, 20.0); // UIImage * imageOut = [self getImageFromCurrentImageContext]; [self endContext]; return imageOut; } @end



, , Quartz 2D, CGSizeMake (-25, 15) , X Y. CGContextSetShadow(context, offset, 20.0) , Quartz 2D, 20.0, . , addTranform: Transform , , UIImag e .



UIImag e. ? viewDidLoad DecoratorViewController , 16–16.



16–16. viewDidLoad DecoratorViewController.m

- (void)viewDidLoad { [super viewDidLoad]; // UIImage *image = [UIImage imageNamed:@"Image.png"]; // CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(-M_PI / 4.0); CGAffineTransform translateTransform = CGAffineTransformMakeTranslation( -image.size.width / 2.0, image.size.height / 8.0); CGAffineTransform finalTransform = CGAffineTransformConcat(rotateTransform, translateTransform); // , // UIImage *transformedImage = [image imageWithTransform:finalTransform]; // id <ImageComponent> finalImage = [transformedImage imageWithDropShadow]; // image view // DecoratorView *decoratorView = [[[DecoratorView alloc] initWithFrame:[self.view bounds]] autorelease]; [decoratorView setImage:finalImage]; [self.view addSubview:decoratorView]; }



, , 16–8 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :



finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];

, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .



. , UIImage . .



Objective-C



– Objective-C, ( ) . . .



, . ; , . , , - , Objective-C ( ) . .



, , , . UIImag e , self UIImage .





Objective-C. . , , , . , . , . – . UIImage .



, , . .

Source: https://habr.com/ru/post/212641/



All Articles