デコレーター(Carlo Chung著「Pro Objective-C Design Patterns for iOS」の英語の章「Decorator」から翻訳)

通常、写真を撮るとき、後から写真を飾る方法は考えません。 瞬間を捉えたいという理由だけで写真を撮ります。 次に、写真の1つを印刷し、それを珍しいガラスのあるフレームに入れることにしたとしましょう。 ただし、後で、同じ写真を別のフレームに配置することもできます。 フレームを変更した場合でも、画像を追加しただけで、同時に変更しなかったため、画像は同じままです。



オブジェクト指向プログラミングでは、元の機能を失うことなく他のオブジェクトに動作を追加するという同様の考え方を取り入れました。つまり、拡張オブジェクトは同じクラスの改良バージョン(フレーム内の写真)になります。 「改善」(フレーム)は、動的に重ね合わせたり削除したりできます。 このデザインパターンをデコレータと呼びます。デコレータを別のデコレータまたはソースオブジェクトに追加してプロパティを拡張し、元の動作をそのまま残すことができるためです。



この章では、まずパターンの概念とそれをいつ使用するかについて説明します。 次に、このパターンを利用して、UIImageオブジェクトの一連のフィルタリングイメージクラスを設計する方法について説明します。



デコレータパターンとは何ですか?



古典的なDecoratorパターンには、親抽象クラスComponent



が含まれています。これは、他の特定のコンポーネントの一般的な操作を宣言します。 抽象Component



クラスは、別のDecorator



クラスにラップできます。 Decorator



は、別のComponent



へのリンクが含まれていComponent



ConcreteDecorator



は、他の同様のComponent



およびDecorator



高度な動作を定義し、それに含まれるComponent



オブジェクトの操作を実行します。 それらの関係を図16-1に示します。



画像



図16–1。 デコレータパターンクラス図



Component



クラスは抽象operation



メソッドを定義し、その具体的なクラスは独自の特定の操作を持つために再定義します。 Decorator



は、オブジェクトにDecorator



を含めることにより、 Component



(またはDecorator



)の他のインスタンスを拡張する「装飾」動作を定義する基本クラスです。 デフォルトのoperation



方法では、メッセージが含まれるcomponent



転送されcomponent



ConcreteDecoratorA



およびConcreteDecoratorB



は、親operation



をオーバーライドして、 super



を使用するoperation



component



メソッド呼び出しの呼び出しに独自のoperation



を追加します。 component



1回だけ展開する必要がある場合は、 Decorator



の基本クラスを無視して、 ConcreteDecorator



すべてのリクエストを直接component



リダイレクトさせることができcomponent



。 これは、図16–2のオブジェクト図に示すように、1つの動作を別の動作の上に追加して一連の操作を形成することに似ています。



画像



図16–2。 Decoratorパターンとその機能の実装



ご注意 デコレータパターン :追加機能をオブジェクトに動的に追加します。 デコレータは、機能を拡張するための継承の柔軟な代替手段を提供します。



* GoFのデザインパターン(Addison Wesley、1994)に記載されている元の定義。



デコレータパターンはいつ使用しますか?



このパターンの使用を検討する可能性のある3つの一般的な状況があります。





「viscera」の変化と比較したオブジェクトの「skin」の変化



前のセクションでは、図16–2に示すように、各デコレータノードの内部組み込みコンポーネントを使用して、実行時にさまざまなデコレータを接続する方法について説明しました。 また、ここでは、各デコレータが外部から組み込みコンポーネントを変更する、つまり、単にオブジェクトのシェルを変更することも示しています。 アイデアは、ノードがそれを変更しているものを知らないということです。



ただし、各ノードが他のノードを認識すると、チェーンは異なる方向、つまり内側から構築されます。 このパターンは戦略と呼ばれます(第19章を参照)。 戦略の別のノードに接続するには、各ノードに異なるAPIのセットを含める必要があります。 この概念の視覚的表現を図16-3に示します。



画像



図16-3。 戦略パターンを使用してオブジェクトの「内部」を変更する



表16-1に、オブジェクトの「スキン」(装飾)と「内部」(戦略)の変更の最終的な違いを示します。



表16–1。 デコレータと戦略の違いの概要表

「スキン」の変更(装飾) 「インサイド」の変化(戦略)
外の変化 内部変更
個々のノードは変更を認識しません。 単一のノードは、事前定義された変更オプションを認識しています。


UIImageイメージのフィルターの作成



画像フィルタリングは、色やジオメトリなどの画像の属性を変更できるプロセスです。 画像の色相を変更できるフィルター、または焦点が合っていないように見えるように暗くするガウスフィルターを使用できます。 何らかの2D変換を適用して、表面が平らに見えないようにすることもできます。 画像にいくつかの「特殊効果」を適用するために使用できる多くの種類のフィルターがあります。 PhotoshopやGIMPなどの多くの写真エディターには、多くのフィルターが付属しています。 Decoratorパターンを使用した画像フィルターは最初に何をしますか?



デコレータパターン-既存の動作とインターフェイスを変更せずにオブジェクトに新しい動作を追加するこの方法。 画像オブジェクトには、属性を管理するためのインターフェースのみが含まれ、それ以上何も含まれないとしましょう。 変換フィルターなど、通常とは異なる何かを追加したいのですが、画像オブジェクトが既に持っている既存のインターフェースを変更したくありません。 できることは、画像オブジェクトと同じですが動作を拡張する必要がある別の画像オブジェクトへのリンクを含む別のクラスを定義することです。 新しいクラスには、グラフィカルコンテキストで自身を描画するためのメソッドが含まれています。 彼の描画方法では、含まれている画像リンクに変換アルゴリズムを適用し、全体像を描画し、結果の画像を返します。 このプロセスは、写真の上に別のガラス層を適用することで説明できます。 画像はガラスについて何も知る必要はありません、そして私たちがそれを見るとき、私たちはまだそれを絵と考えます。 ガラス自体は、画像の外観が異なるように、何らかの色、表面の波状構造などを持っている場合があります。 後で別のレイヤーまたはフィルターを画像に適用する場合は、変換の場合と同じように別のフィルタークラスを定義して、同じメカニズムを適用して画像を変更できます。 変換後の他のフィルターは、結果の画像を取得してプロセスを続行できます。 ただし、注意すべき重要な点が1つあります。フィルターチェーンを介して送信される画像は常にオリジナルである必要はありませんが、同じタイプである必要があります。 変換フィルターの後に返される画像は、変換された画像です。 その後、カラーフィルターに転送されると、返される画像は色が変わり、変換されます。



Cocoa TouchフレームワークのUIKitのUIImageは、画像オブジェクトを表します。 UIImage



クラスUIImage



は、画像を操作するためのかなり限られたインターフェースがあります。 サイズ、色などのいくつかの画像プロパティだけがあります。Quartz2Dフレームワークで利用可能な機能のいくつかで通常の画像オブジェクトを拡張します。 パターンを実装するには、サブクラスとカテゴリの2つのアプローチがあります。



サブクラスを介したデコレーターの実装


サブクラスベースのアプローチの場合、構造は図16–1に示す元のパターンスタイルに似ています。 唯一の違いは、要素の最終的なタイプがUIImage



カテゴリであり、サブクラスではないことです。 UIImage



実装するのと同じインターフェースを共有UIImage



ことをUIImage



構造上の問題が1つあります。 UIImage



NSObject



直接の子孫であり、それ以上のものではありません。 これは一種の最終クラスです。 UIImage



クラスとフィルタクラスの両方を結合するために、「 Component



」インターフェイス(図16–1のクラス図の親インターフェイスとして)を使用するには、回避策が必要です。 現在、2つの問題があります。







私たちは何をするつもりですか? もちろん、まず、このパターンが機能し、両方のタイプのクラスが同じ基本タイプを共有できるように、フィルターUIImage



のグループでUIImage



を分離するためのインターフェイスが必要です。 この目的のためにUIImage



を高レベルの型として使用する(つまり、継承する)という考えは、フィルターを使用するのが困難になるため、悪い考えです。 誰にとっても最適な基本型として、プロトコルの形式でImageComponent



インターフェースを作成します。 しかし、ちょっと待ってください。 UIImage



はどのインターフェイスからも継承せず、単にNSObject



直接継承することは言及しませんでしたか? はい、そうです-ここがクリエイティブなソリューションを必要とする場所です。 UIImage



を実装するUIImage



カテゴリーを作成します。 コンパイラーは、 UIImage



ImageComponent



が相対的であることをUIImage



、誓うことはありません。 UIImage



は、新しいベースタイプを持つことに気づきさえしません。 フィルターを使用する人だけがこれについて知る必要があります。



また、 UIImage



で定義された元のdraw*



メソッドを台無しにするつもりはありませんが、別のImageComponent



描画オプションをどのように拡張しますか? すぐにこれに到達します。



図16-4に、それらの関係を示すクラス図を示します。



画像



図16-4。 Decoratorパターンを実装するさまざまな画像フィルターのクラス図



ImageComponent



プロトコルは、 UIImage



クラスのすべてのdraw*



メソッドで抽象インターフェースを定義します。 特定のImageComponent



および同様のデコレータは、これらの呼び出しを処理できる必要があります。 UIImage



インスタンスのdraw*



メッセージにより、現在のグラフィックスコンテキストでコンテンツを描画できます。 各メソッドは、このコンテキストで変換やその他の効果を作成することもできます。 したがって、 draw*



操作の前に独自のフィルタリングを実装できます。



ここでの特定のコンポーネントはUIImage



タイプですが、ゲームの一部にするためだけにサブクラス化する必要はないため、カテゴリを定義します。 UIImage (ImageComponent)



は、 ImageComponent



プロトコルを実装します。 プロトコルで宣言されたすべてのメソッドはすでにUIImage



クラスにあるため、それらをカテゴリに実装する必要はありません。 このカテゴリは基本的に何も行いませんが、コンパイラにImageComponent



一種でもあることを伝えるだけImageComponent







ImageFilter



は、図16–1のDecorator



クラスに似ています。 ImageFilter



クラスのapply



メソッドを使用すると、特定のフィルタークラスがベースcomponent_



追加の動作を追加できcomponent_



。 すべてのdraw*



メソッドをオーバーライドしてフィルターアクションを実装する代わりに、単一の(id) forwardingTargetForSelector:(SEL)aSelector



を使用してそれらすべてを処理します。 forwardingTargetForSelector:



NSObject



クラスで定義されます。これにより、サブクラスは代替受信者を返してaSelector



セレクターを呼び出すことがaSelector



ます。 ImageFilter



インスタンスImageFilter



aSelector



draw*



メッセージの一部であるかどうかImageFilter



最初にチェックします。 その場合、彼は自分自身にapply



メッセージを送信して、追加の動作を導入してから、 component_



を返してデフォルトのアクションを呼び出します。 apply



メソッドのデフォルト実装は何もしません。 不足している情報はサブクラスによって提供される必要があります。 この方法は、各フィルタークラスが動作を拡張するための同じメカニズムを実装する場合よりもはるかに簡単です。



ImageTransformFilter



ImageShadowFilter



どちらも、 apply



メソッドをオーバーライドして独自のフィルタリングアルゴリズムを提供することに重点を置いていapply



。 これらは、プライベート変数component_



として別のImageComponent



へのリンクを持つImageFilter



基本クラスから継承しcomponent_



。 図16-5に示すように、実行時にさまざまなImageComponent



オブジェクトを接続できます。



画像



図16-5。 各ImageComponentが各レベルのImageComponentの異なるインスタンスで参照されていることを示すオブジェクト図。



このチェーンの右端は元の画像で、図16-6の左側に示されています。 これをanImageTransformFilter



に追加してからanImageTransformFilter



anImageTransformFilter



に追加すると、クライアントは図16-6の右図のようになります。 各ノードはcomponent_



別のImageComponent



インスタンスのcomponent_



としてカプセル化されます。 大きな魚が小さな魚を飲み込む方法との類似性を描くことができます。 明らかに、クライアントはデコレータの詳細を知りませんが、同じ古いUIImage



タイプのインスタンスへのリンクを受け取ります( ImageComponent



はカテゴリを介してUIImage



実装するため、 ImageComponent



の形式で)。



画像



図16-6。 一連のフィルターを適用した後の元の画像と同じ画像



エキサイティングです。 コードで書き留める方法を見てみましょう。 最初に確認するのは、リスト16-1のプロトコルとして宣言されているImageComponent



です。



リスト16–1。 ImageComponent.h

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







ImageComponent



これらの操作をサポートできるようにするため、すべてのdraw*



メソッドは@optional



として宣言されますが、実装クラスで実際に再定義することはありません。 @optional



は、適切なメソッド実装が利用できない可能性があることをコンパイラに通知します。



リスト16–2にはUIImage



カテゴリ宣言が含まれており、後で他のデコレータで使用できます。



リスト16–2。 UIImage + ImageComponent.h

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







彼女(カテゴリ)は、実際の実装なしでImageComponent



プロトコルを実装します。 ここで、メインのデコレータークラスであるImageFilter



ます。 彼の広告はリスト16–3に示されています。



リスト16-3。 ImageFilter.h

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







component_



の形式でImageComponent



へのリンクが含まれており、他の特定のデコレーターを使用してデコードできます。 ImageFilter



forwardingTargetForSelector:



をオーバーライドし、 apply



を宣言しapply



。 クラスの実装をリスト16–4に示します。



リスト16-4。 ImageFilter.m

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







initWithImageComponent:



メソッドはそれほど多くありません。 メソッドパラメータ自体からImageComponent



へのリンクを割り当てるだけです。 また、この場合、特定のフィルタークラスで再度表示されるまで、彼のapply



メソッドは何もしません。



ここで興味深いのは、 forwardingTargetForSelector:



を使用して、 ImageFilter



インスタンスImageFilter



処理方法を知らないメッセージへの呼び出しをインターセプトすることです。 このメソッドにより、サブクラスは別のメッセージ受信者をランタイムに渡し、元のメッセージがリダイレクトされるようにします。 しかし、 @“draw”



プレフィックスを持つすべてのものにのみ関心があり、それ以外のすべてのものを直接component_



リダイレクトして、ランタイムに返します。 たとえば、 drawAtRect:



メッセージdrawAtRect:



ImageFilter



インスタンスに送信されると、そのメッセージdrawAtRect:



forwardingTargetForSelector:



メソッドでインターセプトされ、 ImageFilter



には実装されていないため、代替受信者を待機します。 メッセージには「draw」プレフィックスが含まれているため、このメソッドはapply



メッセージを送信して、 component_



後でメッセージを処理する前に何かを実行します。



これで、実際のフィルターを取得できます。 リスト16-5に示すように、最初に作成するのはImageTransformFilterです。



リスト16-5。 ImageTransformFilter.h

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







ImageTransformFilter



ImageFilter



サブクラスであり、 apply



メソッドをオーバーライドしapply



。 また、 CGAffineTransform



型のprivate transform_



変数とそれに関連するプロパティを宣言してアクセスします。 CGAffineTransform



はC構造体であるため、その値は他のObjective-Cオブジェクトのようにretain



と呼ばれないため、プロパティは割り当て可能な型である必要があります。 フィルターには独自の初期化メソッドがあります。 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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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



, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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



, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



, 166.



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



. , 167, , Quartz 2D CGContextSetShadow()



, . , ImageTransformFilter



. , , , 166.



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



, 168.



168. 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]; }







, 166. CGAffineTransform



. , ImageTransformFilter



. , ImageShadowFilter



, , ImageTransformFilter



. finalImage



– , ImageTransformFilter



, ImageShadowFilter



. DecoratorView



, subview



. DecoratorView



, drawRect:rect



, 169.



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



, , . , , 166.



: .



, , . , .





, , UIImage



, UIImage



, . Objective-C. , - 2D- , – . , , 167.



画像



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



, . , , , , . , , 168.



画像



168. , - UIImage



– , , 166. Shadow



Transform



, , , - 166. , , self



component_



.



. BaseFilter



, , , 1610.



1610. UIImage+BaseFilter.h

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







BaseFilter



, , 1611.



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



. 1612.



1612. UIImage+Transform.h

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







, 1613.



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



, , 1614.



1614. UIImage+Shadow.h

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







, Transform



, Shadow



UIImage



, . , , Transform



. , 1615.



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



, 1616.



1616. 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]; }







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



.



, , . .







All Articles