आमतौर पर, फ़ोटो लेते समय, आप इस बारे में नहीं सोचते हैं कि उन्हें बाद में कैसे सजाया जाए। आप तस्वीरें केवल इसलिए लेते हैं क्योंकि आप उस क्षण को कैप्चर करना चाहते हैं। मान लीजिए कि आपने फिर एक फोटो छापी, फिर उसे एक असामान्य गिलास के साथ एक फ्रेम में रखने का फैसला किया। लेकिन बाद में, आप उसी फोटो को एक अलग फ्रेम में रख सकते हैं यदि आप चाहते हैं। भले ही आपने फ़्रेम बदल दिया हो, चित्र वही बना रहा क्योंकि आपने इसमें कुछ जोड़ा है, लेकिन उसी समय इसे नहीं
बदला ।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, उन्होंने अपनी मूल विशेषताओं को खोए बिना अन्य वस्तुओं के साथ व्यवहार को जोड़ने का एक समान विचार उधार लिया, अर्थात, एक विस्तारित ऑब्जेक्ट उसी वर्ग (फ्रेम में फोटो) का एक बेहतर संस्करण होगा। किसी भी "सुधार" (फ्रेम) को गतिशील रूप से सुपरइम्पोज़ किया और हटाया जा सकता है। हम इस डिज़ाइन पैटर्न को डेकोरेटर कहते हैं, क्योंकि एक डेकोरेटर को उसके गुणों का विस्तार करने के लिए किसी अन्य डेकोरेटर या सोर्स ऑब्जेक्ट में जोड़ा जा सकता है, जिससे मूल व्यवहार बरकरार रहता है।
इस अध्याय में, हम पहले एक पैटर्न की अवधारणाओं पर चर्चा करेंगे और इसका उपयोग कब करेंगे। फिर हम चर्चा करते हैं कि UIImage ऑब्जेक्ट्स के लिए फ़िल्टरिंग छवि वर्गों की एक श्रृंखला डिज़ाइन करने के लिए इस पैटर्न का लाभ कैसे उठाया जाए।
डेकोरेटर पैटर्न क्या है?
क्लासिक डेकोरेटर पैटर्न में मूल अमूर्त वर्ग
Component
, जो अन्य विशिष्ट घटकों के लिए कुछ सामान्य संचालन की घोषणा करता है। अमूर्त
Component
वर्ग को अन्य
Decorator
वर्ग में लपेटा जा सकता है।
Decorator
में किसी अन्य
Component
लिंक होता है।
ConcreteDecorator
अन्य समान
Component
और
Decorator
लिए कुछ उन्नत व्यवहार को परिभाषित करता है और इसमें शामिल
Component
ऑब्जेक्ट का संचालन करता है। उनके संबंध चित्र 16-1 में दर्शाए गए हैं।
चित्र 16–1। डेकोरेटर पैटर्न क्लास डायग्राम
Component
क्लास एक अमूर्त
operation
विधि को परिभाषित करता है, जो कि अपने स्वयं के विशिष्ट संचालन के लिए अपनी ठोस कक्षाओं को फिर से परिभाषित करता है।
Decorator
एक बेस क्लास है जो ऑब्जेक्ट में
Decorator
को शामिल करके
Component
(या
Decorator
) के अन्य उदाहरणों को विस्तारित करने के लिए "सजाने" व्यवहार को परिभाषित करता है। इसकी डिफ़ॉल्ट
operation
विधि केवल शामिल
component
लिए संदेश को आगे करती है।
ConcreteDecoratorA
और
ConcreteDecoratorB
मूल
component
को ओवरराइड करते हैं जो
super
प्रयोग से
operation
component
विधि कॉल के आह्वान पर अपना व्यवहार जोड़ने के लिए होता है। यदि आपको केवल एक बार
component
का विस्तार करने की आवश्यकता है, तो आप
Decorator
के आधार वर्ग की उपेक्षा कर सकते हैं और
Decorator
किसी भी अनुरोध को सीधे
component
पुनर्निर्देशित कर सकते
component
। यह दूसरे के ऊपर एक व्यवहार को जोड़ने के साथ संचालन की एक श्रृंखला बनाने के समान है, जैसा कि चित्र 162 में ऑब्जेक्ट आरेख में चित्रित किया गया है।
चित्र 16–2। डेकोरेटर पैटर्न और इसकी कार्यक्षमता का कार्यान्वयन
नोट।
डेकोरेटर पैटर्न : गतिशील रूप से किसी ऑब्जेक्ट में अतिरिक्त सुविधाओं को जोड़ता है। डेकोरेटर्स कार्यक्षमता को बढ़ाने के लिए विरासत का एक लचीला विकल्प प्रदान करते हैं। *
* GoF के डिज़ाइन पैटर्न (Addison Wesley, 1994) में दी गई मूल परिभाषा।
आप डेकोरेटर पैटर्न का उपयोग कब करेंगे?
ऐसी तीन सामान्य स्थितियाँ हैं जिनमें आप इस पैटर्न का उपयोग करने पर विचार कर सकते हैं:
- आप गतिशील रूप से और पारदर्शी रूप से अन्य वस्तुओं को प्रभावित किए बिना व्यक्तिगत वस्तुओं में कार्यक्षमता जोड़ना चाहते हैं।
- आप एक वर्ग के व्यवहार को आगे बढ़ाना चाहते हैं जिसके साथ यह अव्यावहारिक होगा। एक वर्ग की परिभाषा छिपी हो सकती है और उसे प्राप्त करने के लिए दुर्गम हो सकती है, या वर्ग व्यवहार को विस्तारित करने के लिए प्रत्येक संयोजन का समर्थन करने के लिए बड़ी संख्या में उप-वर्ग की आवश्यकता होगी।
- उन्नत श्रेणी की सुविधाएँ वैकल्पिक हो सकती हैं।
"विस्कोरा" में परिवर्तन की तुलना में किसी वस्तु की "त्वचा" में परिवर्तन
पिछले अनुभाग में, हमने चर्चा की कि प्रत्येक डेकोरेटर नोड में आंतरिक अंतर्निहित घटक का उपयोग करके विभिन्न डेकोरेटर रनटाइम से कैसे जुड़े जा सकते हैं, जैसा कि चित्र 16-2 में दिखाया गया है। यहां यह भी चित्रित किया गया है कि प्रत्येक डेकोरेटर अपने अंतर्निहित घटक को बाहर से बदलता है, अर्थात, यह बस वस्तु के खोल को बदलता है। विचार यह है कि नोड को नहीं पता है कि यह क्या बदल रहा है।
हालांकि, जब प्रत्येक नोड दूसरे नोड्स के बारे में जानता है, तो श्रृंखला एक अलग दिशा में, यानी अंदर से निर्मित होगी। इस पैटर्न को रणनीति (अध्याय 19 देखें) कहा जाता है। रणनीति के दूसरे नोड से जुड़ने के लिए प्रत्येक नोड को अलग-अलग एपीआई का एक सेट शामिल करने की आवश्यकता होती है। इस अवधारणा का एक दृश्य प्रतिनिधित्व चित्र 16-3 में दिखाया गया है।
चित्र 16-3। रणनीति पैटर्न का उपयोग करके वस्तुओं के "इनसाइड" को बदलना
"त्वचा" (डेकोरेटर) और ऑब्जेक्ट की "इनर" (रणनीतियों) में परिवर्तन के बीच अंतिम अंतर तालिका 16-1 में दिखाए गए हैं।
तालिका 16-1। सज्जाकार और रणनीतियों के बीच अंतर की सारांश तालिका
"खाल" (सज्जाकार) बदलना | "इनसाइड" का परिवर्तन (रणनीतियाँ) |
बाहर परिवर्तन | अंदर का बदलाव |
अलग-अलग नोड को परिवर्तनों के बारे में पता नहीं है। | एक एकल नोड पूर्वनिर्धारित परिवर्तन विकल्पों को जानता है। |
UIImage Images के लिए Filters बनाना
इमेज फ़िल्टरिंग वह प्रक्रिया है जिसके द्वारा हम छवियों की विशेषताओं को बदल सकते हैं, जैसे कि रंग और ज्यामिति। हमारे पास एक फ़िल्टर हो सकता है जो छवि के रंग को बदल सकता है, या एक गाऊसी फ़िल्टर को काला कर सकता है ताकि ऐसा लगे कि यह ध्यान से बाहर है। हम इसमें कुछ प्रकार के 2 डी परिवर्तन भी कर सकते हैं ताकि यह सतह पर सपाट न दिखे। कई प्रकार के फिल्टर हैं जिनका उपयोग हम छवि के लिए कुछ "विशेष प्रभावों" को लागू करने के लिए कर सकते हैं। कई फोटो एडिटर जैसे कि फोटोशॉप और जीआईएमपी कई फिल्टर के साथ आते हैं। डेकोरेटर पैटर्न के साथ छवि फ़िल्टर पहले क्या करता है?
डेकोरेटर पैटर्न - मौजूदा व्यवहार और इंटरफ़ेस को बदले बिना किसी वस्तु में नए व्यवहार को जोड़ने की यह विधि। मान लीजिए कि एक छवि ऑब्जेक्ट में केवल विशेषताओं के प्रबंधन के लिए एक इंटरफ़ेस है और इससे अधिक कुछ नहीं है। हम इसमें कुछ असामान्य जोड़ना चाहते हैं, जैसे कि एक परिवर्तन फ़िल्टर, लेकिन हम उन मौजूदा इंटरफेस को संशोधित नहीं करना चाहते हैं जो छवि ऑब्जेक्ट में पहले से हैं। हम जो कर सकते हैं वह एक और वर्ग को परिभाषित करने के लिए है जो कि छवि ऑब्जेक्ट
के समान है लेकिन इसमें एक अन्य छवि ऑब्जेक्ट का लिंक शामिल है जिसके व्यवहार को विस्तारित करने की आवश्यकता है। नए वर्ग में चित्रमय संदर्भ में खुद को खींचने के लिए एक विधि है। अपनी ड्राइंग विधि में, वह शामिल किए गए छवि लिंक पर रूपांतरण एल्गोरिदम लागू करता है, पूरी तस्वीर खींचता है, और परिणामस्वरूप छवि देता है। आप इस प्रक्रिया को चित्र के शीर्ष पर कांच की एक और परत लगाने के रूप में चित्रित कर सकते हैं। छवि को ग्लास के बारे में कुछ भी जानने की आवश्यकता नहीं है, और जब हम इसे देखते हैं, तब भी हम इसे एक तस्वीर मानते हैं। ग्लास में किसी प्रकार का रंग हो सकता है, सतह पर एक लहराती संरचना या कुछ और, ताकि छवि अलग दिखे। यदि बाद में हम छवि पर एक और परत या फ़िल्टर लागू करना चाहते हैं, तो हम एक अलग फ़िल्टर वर्ग को परिभाषित कर सकते हैं, जैसे कि परिवर्तन के मामले में, जिसके साथ हम छवि को बदलने के लिए एक ही तंत्र लागू कर सकते हैं। परिवर्तन के बाद अन्य फ़िल्टर परिणामी छवि को उठा सकते हैं और प्रक्रिया जारी रख सकते हैं। हालांकि, एक बात ध्यान रखना महत्वपूर्ण है - फ़िल्टर श्रृंखला के माध्यम से प्रेषित छवि को हमेशा मूल नहीं होना चाहिए, लेकिन यह उसी प्रकार का होना चाहिए। परिवर्तन फिल्टर के बाद लौटाई गई छवि एक रूपांतरित छवि है। फिर, जब इसे रंग फिल्टर में स्थानांतरित किया जाता है, तो लौटी हुई छवि एक बदले हुए रंग और रूपांतरित, आदि के साथ होगी।
कोको टच फ्रेमवर्क से UIKit में
UIImage
छवि वस्तुओं का प्रतिनिधित्व करता है।
UIImage
वर्ग
UIImage
पास छवि को हेरफेर करने के लिए एक सीमित इंटरफ़ेस है। कुछ छवि गुणों के अलावा कुछ भी नहीं है, जैसे आकार, रंग, आदि। हम क्वार्ट्ज 2 डी फ्रेमवर्क में उपलब्ध कुछ विशेषताओं के साथ सामान्य छवि ऑब्जेक्ट का विस्तार करेंगे। एक पैटर्न को लागू करने के लिए दो दृष्टिकोण हैं - उपवर्ग और श्रेणियां।
उपवर्गों के माध्यम से सज्जाकार को लागू करना
उपवर्ग-आधारित दृष्टिकोण के मामले में, संरचना चित्र 16-1 में दिखाई गई मूल पैटर्न शैली के समान होगी। अंतर केवल इतना है कि अंतिम प्रकार का तत्व
UIImage
श्रेणी होगा, न कि इसका उपवर्ग। एक संरचनात्मक समस्या है जो हमें उसी इंटरफ़ेस को साझा करने से
UIImage
है जो
UIImage
लागू करता है।
UIImage
NSObject
का प्रत्यक्ष वंशज है और इससे ज्यादा कुछ नहीं। यह एक तरह का फाइनल क्लास है। "
Component
" इंटरफ़ेस के कुछ सदुपयोग का उपयोग करने के लिए (चित्र 16-1 में वर्ग आरेख में मूल इंटरफ़ेस के रूप में), दोनों
UIImage
और फ़िल्टर वर्गों को एक साथ संयोजित करने के लिए, हमें वर्कअराउंड की आवश्यकता है। अब हमें दो समस्याएं हैं:
- हमें अपने फ़िल्टर वर्गों को
UImage
के समान बनाने की आवश्यकता है, लेकिन साझा पृथक्करण के लिए UIImage
का उच्च-स्तरीय इंटरफ़ेस नहीं है ( UIImage
से उत्तराधिकार यहाँ ग्रहण नहीं किया गया है)। UIImage
में वर्तमान संदर्भ में आरेखण सामग्री से संबंधित कई विधियाँ हैं, जैसे कि drawAsPatternInRect:
drawAtPoint:
drawAtPoint:blendMode:alpha:
drawAtPoint:
drawAtPoint:blendMode:alpha:
drawInRect:
और drawInRect:blendMode:alpha:
यदि हम फ़िल्टर कक्षाओं को समान विधियों को लागू करने की अनुमति देते हैं, तो हम सब कुछ जटिल करते हैं और हमें वह परिणाम प्राप्त नहीं हो सकता है जो हम क्वैड 3 डी काम करते हैं। हम बाद में इस पर वापस आएंगे।
हम क्या करने जा रहे हैं? सबसे पहले, निश्चित रूप से, हमें
UIImage
को फ़िल्टर कक्षाओं के एक समूह के साथ अलग करने के लिए एक इंटरफ़ेस की आवश्यकता है ताकि यह पैटर्न काम करे और दोनों प्रकार की कक्षाएं एक ही मूल प्रकार साझा कर सकें।
UIImage
को इस उद्देश्य के लिए एक उच्च-स्तरीय प्रकार के रूप में उपयोग करने का विचार (यानी, इससे विरासत में मिला) खराब है, क्योंकि तब फ़िल्टर का उपयोग करना मुश्किल होगा। हम सभी के लिए इष्टतम आधार प्रकार के रूप में एक प्रोटोकॉल के रूप में
ImageComponent
इंटरफ़ेस बनाते हैं। लेकिन एक पल रुकिए; क्या हमने यह उल्लेख नहीं किया है कि
UIImage
किसी भी इंटरफ़ेस से विरासत में नहीं मिला है, लेकिन सीधे सीधे
NSObject
को विरासत में मिला है? हां, यह सही है - जहां हमें एक रचनात्मक समाधान की आवश्यकता है। हम एक
UIImage
श्रेणी
ImageComponent
जो
ImageComponent
लागू
ImageComponent
। तब कंपाइलर को पता चल जाएगा कि
UIImage
और
ImageComponent
रिश्तेदार हैं, और शपथ नहीं लेंगे।
UIImage
को इस बात की भी जानकारी नहीं है कि अब उसका नया आधार प्रकार है। केवल वे लोग जो फ़िल्टर का उपयोग करेंगे, उन्हें इसके बारे में जानने की आवश्यकता है।
इसके अलावा, हम
UIImage
में परिभाषित मूल
draw*
विधियों के साथ गड़बड़ नहीं करेंगे, लेकिन फिर हम एक अन्य
ImageComponent
में ड्राइंग विकल्पों का विस्तार कैसे करेंगे? हम जल्द ही इस पर विचार करेंगे।
एक वर्ग चित्र जो उनके रिश्तों को दर्शाता है, चित्र 16-4 में दिखाया गया है।
चित्र 16-4। विभिन्न छवि फ़िल्टर का वर्ग आरेख जो सज्जाकार पैटर्न को लागू करता है
ImageComponent
प्रोटोकॉल
UIImage
वर्ग के सभी
draw*
तरीकों के साथ एक अमूर्त इंटरफ़ेस को परिभाषित करता है। किसी भी विशेष
ImageComponent
और इसी तरह के सज्जाकार इन कॉल को संभालने में सक्षम होना चाहिए।
UIImage
उदाहरण के लिए
draw*
संदेश इसे वर्तमान ग्राफिक्स संदर्भ में अपनी सामग्री खींचने की अनुमति देगा। प्रत्येक विधि इस संदर्भ में परिवर्तन और अन्य प्रभाव भी बना सकती है। इस प्रकार, हम किसी भी
draw*
ऑपरेशन से पहले अपने स्वयं के फ़िल्टरिंग को लागू कर सकते हैं।
यहाँ हमारा विशेष घटक
UIImage
प्रकार है, लेकिन हम इसे केवल खेल का हिस्सा बनाने के लिए उप-वर्ग नहीं करना चाहते हैं, इसलिए हम इसके लिए एक श्रेणी निर्धारित करते हैं।
UIImage (ImageComponent)
ImageComponent
प्रोटोकॉल को लागू
ImageComponent
है। चूंकि प्रोटोकॉल में घोषित सभी विधियां पहले से ही
UIImage
वर्ग में हैं, इसलिए हमें उन्हें श्रेणी में लागू करने की आवश्यकता नहीं है। श्रेणी मूल रूप से कुछ भी नहीं करती है, लेकिन केवल संकलक को बताती है कि यह एक प्रकार का
ImageComponent
।
ImageFilter
16-1 में
ImageFilter
वर्ग की तरह है।
ImageFilter
वर्ग की
apply
विधि विशिष्ट फ़िल्टर वर्गों को आधार
ImageFilter
लिए अतिरिक्त व्यवहार जोड़ने की अनुमति देती है। फ़िल्टर क्रियाओं को कार्यान्वित करने के लिए सभी
draw*
विधियों को ओवरराइड करने के बजाय, हम सभी को संसाधित करने के लिए एक एकल
(id) forwardingTargetForSelector:(SEL)aSelector
का उपयोग करते हैं।
aSelector
सेलेक्टर:
aSelector
क्लास में परिभाषित किया गया है, जो उप-वर्ग को सेलेक्टर को
aSelector
लिए वैकल्पिक प्राप्तकर्ता को वापस करने की अनुमति देता है।
ImageFilter
उदाहरण पहले जाँच
ImageFilter
कि क्या
aSelector
कुछ
draw*
संदेश है। यदि ऐसा है, तो वह डिफ़ॉल्ट क्रियाओं को लागू करने के लिए लौटते
component_
को अतिरिक्त व्यवहार का परिचय देने के लिए स्वयं को एक संदेश भेजेगा।
apply
पद्धति का डिफ़ॉल्ट कार्यान्वयन कुछ नहीं करता है। उपवर्गों द्वारा अनुपलब्ध जानकारी प्रदान की जानी चाहिए। यदि प्रत्येक फ़िल्टर वर्ग व्यवहार को बढ़ाने के लिए एक ही तंत्र लागू करता है, तो यह दृष्टिकोण बहुत सरल है।
ImageTransformFilter
और
ImageShadowFilter
दोनों
apply
पद्धति को ओवरराइड करके अपने स्वयं के फ़िल्टरिंग एल्गोरिदम प्रदान करने पर ध्यान केंद्रित करते हैं। वे
ImageFilter
बेस क्लास से इनहेरिट करते हैं, जिसका एक निजी चर
component_
रूप में एक और
ImageComponent
लिंक है। विभिन्न
ImageComponent
वस्तुओं को रनटाइम पर जोड़ा जा सकता है, जैसा कि चित्र 16-5 में दिखाया गया है।
चित्र 16-5। एक ऑब्जेक्ट आरेख यह दर्शाता है कि प्रत्येक ImageComponent को प्रत्येक स्तर पर ImageComponent के एक अलग उदाहरण में संदर्भित किया जाता है।
इस श्रृंखला का दाहिना छोर मूल छवि है, जिसे चित्र 16-6 में बाईं ओर दिखाया गया है। जब हम इसे
anImageTransformFilter
और उसके बाद
anImageTransformFilter
को
anImageShadowFilter
, तो क्लाइंट को चित्र 16-6 में सही चित्र जैसा कुछ मिलेगा। प्रत्येक नोड को एक अन्य
ImageComponent
उदाहरण के
ImageComponent
रूप में समझाया गया है। एक सादृश्य के साथ खींचा जा सकता है कि कैसे एक बड़ी मछली एक छोटे को निगल जाती है। जाहिर है, क्लाइंट को डेकोरेटर्स का कोई विवरण नहीं पता है, लेकिन बस उसी पुराने
UIImage
प्रकार (
ImageComponent
के रूप में, क्योंकि
UIImage
श्रेणी के माध्यम से
ImageComponent
लागू करता है) के एक उदाहरण के लिए एक लिंक प्राप्त करता है।
चित्र 16-6। फिल्टर की एक श्रृंखला को लागू करने के बाद मूल छवि और एक ही छवि
यह रोमांचक है। आइए देखें कि आप इसे कोड में कैसे जोड़ सकते हैं। पहली चीज़ जो हम देखेंगे, वह
ImageComponent
, जिसे 16-1 में सूचीबद्ध करने के प्रोटोकॉल के रूप में घोषित किया गया है।
लिस्टिंग 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
सभी
draw*
विधियाँ
@optional
रूप में घोषित की
@optional
, क्योंकि हम चाहते हैं कि प्रत्येक
ImageComponent
इन परिचालनों का समर्थन करने में सक्षम हो, लेकिन हम वास्तव में उन्हें लागू करने वाली कक्षाओं में फिर से परिभाषित नहीं करते हैं।
@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
इसमें
ImageComponent
के रूप में
ImageComponent
लिंक शामिल है, जिसे किसी अन्य विशिष्ट सज्जाकार का उपयोग करके डिकोड किया जा सकता है।
ImageFilter
forwardingTargetForSelector:
ImageFilter
ओवरराइड करता है
forwardingTargetForSelector:
और
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
उपयोग करते हैं
forwardingTargetForSelector:
उन संदेशों को कॉल इंटरसेप्ट करने के लिए जो
ImageFilter
इंस्टेंस को संभालना नहीं जानते। यह विधि उपवर्गों को रनटाइम के लिए एक अन्य संदेश प्राप्तकर्ता को पास करने की अनुमति देती है ताकि मूल संदेश को पुनर्निर्देशित किया जा सके। लेकिन हम केवल उन सभी चीज़ों में रुचि रखते हैं, जिनमें
@“draw”
उपसर्ग है, और फिर हम हर चीज़ को सीधे
component_
रीडायरेक्ट करते
component_
, इसे रनटाइम पर लौटाते हैं। उदाहरण के लिए, जब एक
drawAtRect:
संदेश को एक
ImageFilter
इंस्टेंस पर भेजा जाता है, तो इसे
forwardingTargetForSelector:
ImageFilter
में इंटरसेप्ट किया जाएगा
forwardingTargetForSelector:
एक वैकल्पिक प्राप्तकर्ता की प्रतीक्षा में, क्योंकि
ImageFilter
इसके लिए कोई कार्यान्वयन नहीं है। चूंकि संदेश में "ड्रा" उपसर्ग होता है, इसलिए मेथड_ प्रक्रिया से पहले कुछ करने के लिए विधि एक संदेश भेजता है।
अब हम कुछ वास्तविक फ़िल्टर प्राप्त कर सकते हैं। पहला हम बनाने जा रहे हैं ImageTransformFilter, जैसा कि 16-5 लिस्टिंग में दिखाया गया है।
लिस्टिंग 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
का एक उपवर्ग है और
apply
विधि को ओवरराइड करता है। यह इसे एक्सेस करने के लिए अपनी संबंधित संपत्ति के साथ
CGAffineTransform
प्रकार का एक निजी
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
.
, , . .