éåžžãåçãæ®ããšããåŸããåçã食ãæ¹æ³ã¯èããŸããã ç¬éãæããããšããçç±ã ãã§åçãæ®ããŸãã 次ã«ãåçã®1ã€ãå°å·ãããããçããã¬ã©ã¹ã®ãããã¬ãŒã ã«å
¥ããããšã«ãããšããŸãããã ãã ããåŸã§ãåãåçãå¥ã®ãã¬ãŒã ã«é
眮ããããšãã§ããŸãã ãã¬ãŒã ãå€æŽããå Žåã§ããç»åãè¿œå ããã ãã§ãåæã«
å€æŽããªãã£ããããç»åã¯åããŸãŸã§ãã
ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã§ã¯ãå
ã®æ©èœã倱ãããšãªãä»ã®ãªããžã§ã¯ãã«åäœãè¿œå ãããšããåæ§ã®èãæ¹ãåãå
¥ããŸãããã€ãŸããæ¡åŒµãªããžã§ã¯ãã¯åãã¯ã©ã¹ã®æ¹è¯ããŒãžã§ã³ïŒãã¬ãŒã å
ã®åçïŒã«ãªããŸãã ãæ¹åãïŒãã¬ãŒã ïŒã¯ãåçã«éãåããããåé€ãããã§ããŸãã ãã®ãã¶ã€ã³ãã¿ãŒã³ããã³ã¬ãŒã¿ãšåŒã³ãŸãããã³ã¬ãŒã¿ãå¥ã®ãã³ã¬ãŒã¿ãŸãã¯ãœãŒã¹ãªããžã§ã¯ãã«è¿œå ããŠããããã£ãæ¡åŒµããå
ã®åäœããã®ãŸãŸæ®ãããšãã§ããããã§ãã
ãã®ç« ã§ã¯ããŸããã¿ãŒã³ã®æŠå¿µãšããããã€äœ¿çšãããã«ã€ããŠèª¬æããŸãã 次ã«ããã®ãã¿ãŒã³ãå©çšããŠãUIImageãªããžã§ã¯ãã®äžé£ã®ãã£ã«ã¿ãªã³ã°ã€ã¡ãŒãžã¯ã©ã¹ãèšèšããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã³ã¬ãŒã¿ãã¿ãŒã³ãšã¯äœã§ããïŒ
å€å
žçãªDecoratorãã¿ãŒã³ã«ã¯ã芪æœè±¡ã¯ã©ã¹
Component
ãå«ãŸããŠããŸããããã¯ãä»ã®ç¹å®ã®ã³ã³ããŒãã³ãã®äžè¬çãªæäœã宣èšããŸãã æœè±¡
Component
ã¯ã©ã¹ã¯ãå¥ã®
Decorator
ã¯ã©ã¹ã«ã©ããã§ããŸãã
Decorator
ã¯ãå¥ã®
Component
ãžã®ãªã³ã¯ãå«ãŸããŠã
Component
ã
ConcreteDecorator
ã¯ãä»ã®åæ§ã®
Component
ããã³
Decorator
é«åºŠãªåäœãå®çŸ©ããããã«å«ãŸãã
Component
ãªããžã§ã¯ãã®æäœãå®è¡ããŸãã ãããã®é¢ä¿ãå³16-1ã«ç€ºããŸãã
å³16â1ã ãã³ã¬ãŒã¿ãã¿ãŒã³ã¯ã©ã¹å³
Component
ã¯ã©ã¹ã¯æœè±¡
operation
ã¡ãœãããå®çŸ©ãããã®å
·äœçãªã¯ã©ã¹ã¯ç¬èªã®ç¹å®ã®æäœãæã€ããã«åå®çŸ©ããŸãã
Decorator
ã¯ããªããžã§ã¯ãã«
Decorator
ãå«ããããšã«ããã
Component
ïŒãŸãã¯
Decorator
ïŒã®ä»ã®ã€ã³ã¹ã¿ã³ã¹ãæ¡åŒµãããè£
食ãåäœãå®çŸ©ããåºæ¬ã¯ã©ã¹ã§ãã ããã©ã«ãã®
operation
æ¹æ³ã§ã¯ãã¡ãã»ãŒãžãå«ãŸãã
component
転éãã
component
ã
ConcreteDecoratorA
ããã³
ConcreteDecoratorB
ã¯ã芪
operation
ããªãŒããŒã©ã€ãããŠã
super
ã䜿çšãã
operation
component
ã¡ãœããåŒã³åºãã®åŒã³åºãã«ç¬èªã®
operation
ãè¿œå ããŸãã
component
1åã ãå±éããå¿
èŠãããå Žåã¯ã
Decorator
ã®åºæ¬ã¯ã©ã¹ãç¡èŠããŠã
ConcreteDecorator
ãã¹ãŠã®ãªã¯ãšã¹ããçŽæ¥
component
ãªãã€ã¬ã¯ããããããšãã§ã
component
ã ããã¯ãå³16â2ã®ãªããžã§ã¯ãå³ã«ç€ºãããã«ã1ã€ã®åäœãå¥ã®åäœã®äžã«è¿œå ããŠäžé£ã®æäœã圢æããããšã«äŒŒãŠããŸãã
å³16â2ã Decoratorãã¿ãŒã³ãšãã®æ©èœã®å®è£
ã泚æ
ãã³ã¬ãŒã¿ãã¿ãŒã³ ïŒè¿œå æ©èœããªããžã§ã¯ãã«åçã«è¿œå ããŸãã ãã³ã¬ãŒã¿ã¯ãæ©èœãæ¡åŒµããããã®ç¶æ¿ã®æè»ãªä»£æ¿æ段ãæäŸããŸãã
* GoFã®ãã¶ã€ã³ãã¿ãŒã³ïŒAddison Wesleyã1994ïŒã«èšèŒãããŠããå
ã®å®çŸ©ã
ãã³ã¬ãŒã¿ãã¿ãŒã³ã¯ãã€äœ¿çšããŸããïŒ
ãã®ãã¿ãŒã³ã®äœ¿çšãæ€èšããå¯èœæ§ã®ãã3ã€ã®äžè¬çãªç¶æ³ããããŸãã
- ä»ã®ãªããžã§ã¯ãã«åœ±é¿ãäžããããšãªããåçãã€ééçã«åã
ã®ãªããžã§ã¯ãã«æ©èœãè¿œå ããŸãã
- ãããå®çšçã§ã¯ãªãã¯ã©ã¹ã®åäœãæ¡åŒµãããå Žåã ã¯ã©ã¹å®çŸ©ãé衚瀺ã«ããŠç¶æ¿ã§ããªãå Žåããã¯ã©ã¹ã®åäœãæ¡åŒµããã«ã¯ãæ©èœã®åçµã¿åããããµããŒãããããã«èšå€§ãªæ°ã®ãµãã¯ã©ã¹ãå¿
èŠã«ãªããŸãã
- é«åºŠãªã¯ã©ã¹æ©èœã¯ãªãã·ã§ã³ã§ãã
ãvisceraãã®å€åãšæ¯èŒãããªããžã§ã¯ãã®ãskinãã®å€å
åã®ã»ã¯ã·ã§ã³ã§ã¯ãå³16â2ã«ç€ºãããã«ãåãã³ã¬ãŒã¿ããŒãã®å
éšçµã¿èŸŒã¿ã³ã³ããŒãã³ãã䜿çšããŠãå®è¡æã«ããŸããŸãªãã³ã¬ãŒã¿ãæ¥ç¶ããæ¹æ³ã«ã€ããŠèª¬æããŸããã ãŸããããã§ã¯ãåãã³ã¬ãŒã¿ãå€éšããçµã¿èŸŒã¿ã³ã³ããŒãã³ããå€æŽãããã€ãŸããåã«ãªããžã§ã¯ãã®ã·ã§ã«ãå€æŽããããšã瀺ããŠããŸãã ã¢ã€ãã¢ã¯ãããŒãããããå€æŽããŠãããã®ãç¥ããªããšããããšã§ãã
ãã ããåããŒããä»ã®ããŒããèªèãããšããã§ãŒã³ã¯ç°ãªãæ¹åãã€ãŸãå
åŽããæ§ç¯ãããŸãã ãã®ãã¿ãŒã³ã¯æŠç¥ãšåŒã°ããŸãïŒç¬¬19ç« ãåç
§ïŒã æŠç¥ã®å¥ã®ããŒãã«æ¥ç¶ããã«ã¯ãåããŒãã«ç°ãªãAPIã®ã»ãããå«ããå¿
èŠããããŸãã ãã®æŠå¿µã®èŠèŠçè¡šçŸãå³16-3ã«ç€ºããŸãã
å³16-3ã æŠç¥ãã¿ãŒã³ã䜿çšããŠãªããžã§ã¯ãã®ãå
éšããå€æŽãã
è¡š16-1ã«ããªããžã§ã¯ãã®ãã¹ãã³ãïŒè£
食ïŒãšãå
éšãïŒæŠç¥ïŒã®å€æŽã®æçµçãªéãã瀺ããŸãã
è¡š16â1ã ãã³ã¬ãŒã¿ãšæŠç¥ã®éãã®æŠèŠè¡š
ãã¹ãã³ãã®å€æŽïŒè£
é£ŸïŒ | ãã€ã³ãµã€ããã®å€åïŒæŠç¥ïŒ |
å€ã®å€å | å
éšå€æŽ |
åã
ã®ããŒãã¯å€æŽãèªèããŸããã | åäžã®ããŒãã¯ãäºåå®çŸ©ãããå€æŽãªãã·ã§ã³ãèªèããŠããŸãã |
UIImageã€ã¡ãŒãžã®ãã£ã«ã¿ãŒã®äœæ
ç»åãã£ã«ã¿ãªã³ã°ã¯ãè²ããžãªã¡ããªãªã©ã®ç»åã®å±æ§ãå€æŽã§ããããã»ã¹ã§ãã ç»åã®è²çžãå€æŽã§ãããã£ã«ã¿ãŒããŸãã¯çŠç¹ãåã£ãŠããªãããã«èŠããããã«æãããã¬ãŠã¹ãã£ã«ã¿ãŒã䜿çšã§ããŸãã äœããã®2Då€æãé©çšããŠãè¡šé¢ãå¹³ãã«èŠããªãããã«ããããšãã§ããŸãã ç»åã«ããã€ãã®ãç¹æ®å¹æããé©çšããããã«äœ¿çšã§ããå€ãã®çš®é¡ã®ãã£ã«ã¿ãŒããããŸãã PhotoshopãGIMPãªã©ã®å€ãã®åçãšãã£ã¿ãŒã«ã¯ãå€ãã®ãã£ã«ã¿ãŒãä»å±ããŠããŸãã Decoratorãã¿ãŒã³ã䜿çšããç»åãã£ã«ã¿ãŒã¯æåã«äœãããŸããïŒ
ãã³ã¬ãŒã¿ãã¿ãŒã³-æ¢åã®åäœãšã€ã³ã¿ãŒãã§ã€ã¹ãå€æŽããã«ãªããžã§ã¯ãã«æ°ããåäœãè¿œå ãããã®æ¹æ³ã ç»åãªããžã§ã¯ãã«ã¯ãå±æ§ã管çããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ãå«ãŸãããã以äžäœãå«ãŸããªããšããŸãããã å€æãã£ã«ã¿ãŒãªã©ãéåžžãšã¯ç°ãªãäœããè¿œå ãããã®ã§ãããç»åãªããžã§ã¯ããæ¢ã«æã£ãŠããæ¢åã®ã€ã³ã¿ãŒãã§ãŒã¹ãå€æŽããããããŸããã ã§ããããšã¯ãç»åãªããžã§ã¯ã
ãšåãã§ãã
ãåäœãæ¡åŒµããå¿
èŠãããå¥ã®ç»åãªããžã§ã¯ããžã®ãªã³ã¯ãå«ãå¥ã®ã¯ã©ã¹ãå®çŸ©ããããšã§ãã æ°ããã¯ã©ã¹ã«ã¯ãã°ã©ãã£ã«ã«ã³ã³ããã¹ãã§èªèº«ãæç»ããããã®ã¡ãœãããå«ãŸããŠããŸãã 圌ã®æç»æ¹æ³ã§ã¯ãå«ãŸããŠããç»åãªã³ã¯ã«å€æã¢ã«ãŽãªãºã ãé©çšããå
šäœåãæç»ããçµæã®ç»åãè¿ããŸãã ãã®ããã»ã¹ã¯ãåçã®äžã«å¥ã®ã¬ã©ã¹å±€ãé©çšããããšã§èª¬æã§ããŸãã ç»åã¯ã¬ã©ã¹ã«ã€ããŠäœãç¥ãå¿
èŠã¯ãããŸããããããŠç§ãã¡ããããèŠããšããç§ãã¡ã¯ãŸã ãããçµµãšèããŸãã ã¬ã©ã¹èªäœã¯ãç»åã®å€èŠ³ãç°ãªãããã«ãäœããã®è²ãè¡šé¢ã®æ³¢ç¶æ§é ãªã©ãæã£ãŠããå ŽåããããŸãã åŸã§å¥ã®ã¬ã€ã€ãŒãŸãã¯ãã£ã«ã¿ãŒãç»åã«é©çšããå Žåã¯ãå€æã®å Žåãšåãããã«å¥ã®ãã£ã«ã¿ãŒã¯ã©ã¹ãå®çŸ©ããŠãåãã¡ã«ããºã ãé©çšããŠç»åãå€æŽã§ããŸãã å€æåŸã®ä»ã®ãã£ã«ã¿ãŒã¯ãçµæã®ç»åãååŸããŠããã»ã¹ãç¶è¡ã§ããŸãã ãã ãã泚æãã¹ãéèŠãªç¹ã1ã€ãããŸãããã£ã«ã¿ãŒãã§ãŒã³ãä»ããŠéä¿¡ãããç»åã¯åžžã«ãªãªãžãã«ã§ããå¿
èŠã¯ãããŸããããåãã¿ã€ãã§ããå¿
èŠããããŸãã å€æãã£ã«ã¿ãŒã®åŸã«è¿ãããç»åã¯ãå€æãããç»åã§ãã ãã®åŸãã«ã©ãŒãã£ã«ã¿ãŒã«è»¢éããããšãè¿ãããç»åã¯è²ãå€ãããå€æãããŸãã
Cocoa Touchãã¬ãŒã ã¯ãŒã¯ã®UIKitã®UIImageã¯ãç»åãªããžã§ã¯ããè¡šããŸãã
UIImage
ã¯ã©ã¹
UIImage
ã¯ãç»åãæäœããããã®ããªãéãããã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã ãµã€ãºãè²ãªã©ã®ããã€ãã®ç»åããããã£ã ãããããŸããQuartz2Dãã¬ãŒã ã¯ãŒã¯ã§å©çšå¯èœãªæ©èœã®ããã€ãã§éåžžã®ç»åãªããžã§ã¯ããæ¡åŒµããŸãã ãã¿ãŒã³ãå®è£
ããã«ã¯ããµãã¯ã©ã¹ãšã«ããŽãªã®2ã€ã®ã¢ãããŒãããããŸãã
ãµãã¯ã©ã¹ãä»ãããã³ã¬ãŒã¿ãŒã®å®è£
ãµãã¯ã©ã¹ããŒã¹ã®ã¢ãããŒãã®å Žåãæ§é ã¯å³16â1ã«ç€ºãå
ã®ãã¿ãŒã³ã¹ã¿ã€ã«ã«äŒŒãŠããŸãã å¯äžã®éãã¯ãèŠçŽ ã®æçµçãªã¿ã€ãã
UIImage
ã«ããŽãªã§ããããµãã¯ã©ã¹ã§ã¯ãªãããšã§ãã
UIImage
å®è£
ããã®ãšåãã€ã³ã¿ãŒãã§ãŒã¹ãå
±æ
UIImage
ããšã
UIImage
æ§é äžã®åé¡ã1ã€ãããŸãã
UIImage
ã¯
NSObject
çŽæ¥ã®åå«ã§ããããã以äžã®ãã®ã§ã¯ãããŸããã ããã¯äžçš®ã®æçµã¯ã©ã¹ã§ãã
UIImage
ã¯ã©ã¹ãšãã£ã«ã¿ã¯ã©ã¹ã®äž¡æ¹ãçµåããããã«ãã
Component
ãã€ã³ã¿ãŒãã§ã€ã¹ïŒå³16â1ã®ã¯ã©ã¹å³ã®èŠªã€ã³ã¿ãŒãã§ã€ã¹ãšããŠïŒã䜿çšããã«ã¯ãåé¿çãå¿
èŠã§ãã çŸåšã2ã€ã®åé¡ããããŸãã
- ãã£ã«ã¿ãŒã¯ã©ã¹ã
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
.
, , . .