オブジェクト指向プログラミングでは、元の機能を失うことなく他のオブジェクトに動作を追加するという同様の考え方を取り入れました。つまり、拡張オブジェクトは同じクラスの改良バージョン(フレーム内の写真)になります。 「改善」(フレーム)は、動的に重ね合わせたり削除したりできます。 このデザインパターンをデコレータと呼びます。デコレータを別のデコレータまたはソースオブジェクトに追加してプロパティを拡張し、元の動作をそのまま残すことができるためです。
この章では、まずパターンの概念とそれをいつ使用するかについて説明します。 次に、このパターンを利用して、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つの問題があります。
- フィルタークラスを
UImage
と同じにする必要がありますが、UIImage
は共有分離のための高レベルインターフェイスはありません(UIImage
からのUIImage
はここでは想定されていません)。 -
UIImage
はdrawAsPatternInRect:
drawAtPoint:
drawAtPoint:blendMode:alpha:
drawAtPoint:
drawAtPoint:blendMode:alpha:
drawInRect:
、drawInRect:blendMode:alpha:
など、現在のコンテキストのコンテンツの描画に関連するいくつかのメソッドがありdrawInRect:blendMode:alpha:
フィルタークラスで同じメソッドを実装できるようにすると、すべてが複雑になり、Quartz 2Dの動作に応じた結果が得られない場合があります。 これについては後で説明します。
私たちは何をするつもりですか? もちろん、まず、このパターンが機能し、両方のタイプのクラスが同じ基本タイプを共有できるように、フィルター
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
.
, , . .
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
.
, , . .