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.
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.

| Change "skins" (Decorators) | Changing the "entrails" (Strategies) |
| Changes outside | Changes from the inside |
| Separate node not aware of changes | The individual node knows the predefined change capabilities. |
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.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:UImage , but the UIImage does not have a high-level interface for sharing (the inheritance from the UIImage is not assumed here).UIImage has several methods related to drawing content in the current context, such as drawAsPatternInRect: drawAtPoint: drawAtPoint:blendMode:alpha: drawInRect: and drawInRect:blendMode:alpha: If we allow the filter classes to implement the same methods, then we will complicate everything and we may not get the result we want in accordance with the way Quartz 2D works. We will come back to this later.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.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.
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.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.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.
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).
ImageComponent , which is declared as a protocol in Listing 16-1. @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 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.UIImage , which we can use with other decorators later. #import "ImageComponent.h" @interface UIImage (ImageComponent) <ImageComponent> @end ImageComponent protocol without any real implementation. Now we turn to our main decorator class - ImageFilter . His ad is shown in Listing 16β3. #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 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. #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 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.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. #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.

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.

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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.

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.

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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.
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.
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.

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.

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.

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.

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.

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.

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