デコレヌタヌ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    ,     16–6. 

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

16–9. drawRect:rect DecoratorView.m
- (void)drawRect:(CGRect)rect { // . [image_ drawInRect:rect]; }

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

: .

, , . , .


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

画像

16–7. , UIImage

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

画像

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

16–10. UIImage+BaseFilter.h
@interface UIImage (BaseFilter) - (CGContextRef) beginContext; - (UIImage *) getImageFromCurrentImageContext; - (void) endContext; @end

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

16–12. UIImage+Transform.h
@interface UIImage (Transform) - (UIImage *) imageWithTransform:(CGAffineTransform)transform; @end

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

16–14. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

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

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

finalImage = [[image imageWithTransform:finalTransform] imageWithDropShadow];
, , , ? – UIImage – , , . , , – UIImage ! ImageComponent , UIImage . .

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .

Source: https://habr.com/ru/post/J212641/


All Articles