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/