डेकोरेटर (कार्लो कंग द्वारा "आईओएस के लिए प्रो ऑब्जेक्टिव-सी डिज़ाइन पैटर्न" पुस्तक से अंग्रेजी अध्याय "डेकोरेटर" का अनुवाद)

आमतौर पर, फ़ोटो लेते समय, आप इस बारे में नहीं सोचते हैं कि उन्हें बाद में कैसे सजाया जाए। आप तस्वीरें केवल इसलिए लेते हैं क्योंकि आप उस क्षण को कैप्चर करना चाहते हैं। मान लीजिए कि आपने फिर एक फोटो छापी, फिर उसे एक असामान्य गिलास के साथ एक फ्रेम में रखने का फैसला किया। लेकिन बाद में, आप उसी फोटो को एक अलग फ्रेम में रख सकते हैं यदि आप चाहते हैं। भले ही आपने फ़्रेम बदल दिया हो, चित्र वही बना रहा क्योंकि आपने इसमें कुछ जोड़ा है, लेकिन उसी समय इसे नहीं बदला

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, उन्होंने अपनी मूल विशेषताओं को खोए बिना अन्य वस्तुओं के साथ व्यवहार को जोड़ने का एक समान विचार उधार लिया, अर्थात, एक विस्तारित ऑब्जेक्ट उसी वर्ग (फ्रेम में फोटो) का एक बेहतर संस्करण होगा। किसी भी "सुधार" (फ्रेम) को गतिशील रूप से सुपरइम्पोज़ किया और हटाया जा सकता है। हम इस डिज़ाइन पैटर्न को डेकोरेटर कहते हैं, क्योंकि एक डेकोरेटर को उसके गुणों का विस्तार करने के लिए किसी अन्य डेकोरेटर या सोर्स ऑब्जेक्ट में जोड़ा जा सकता है, जिससे मूल व्यवहार बरकरार रहता है।

इस अध्याय में, हम पहले एक पैटर्न की अवधारणाओं पर चर्चा करेंगे और इसका उपयोग कब करेंगे। फिर हम चर्चा करते हैं कि 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 और फ़िल्टर वर्गों को एक साथ संयोजित करने के लिए, हमें वर्कअराउंड की आवश्यकता है। अब हमें दो समस्याएं हैं:



हम क्या करने जा रहे हैं? सबसे पहले, निश्चित रूप से, हमें 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 , ShadowUIImage , . , , 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 , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , 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 , ShadowUIImage , . , , 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 , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .
 initWithImageComponent:(id )component transform: (CGAffineTransform)tranform   ImageComponent   CGAffineTransform   . component    initWithComponent:   super ,  transform    ,     166. 

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

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

ImageTransformFilter , ImageShadowFilter ImageFilter apply . , 167, , Quartz 2D CGContextSetShadow() , . , ImageTransformFilter . , , , 166.

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

. - DecoratorViewController , viewDidLoad , 168.

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

, 166. CGAffineTransform . , ImageTransformFilter . , ImageShadowFilter , , ImageTransformFilter . finalImage – , ImageTransformFilter , ImageShadowFilter . DecoratorView , subview . DecoratorView , drawRect:rect , 169.

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

DecoratorView UIImage image_ . drawRect:rect drawInRect:rect image_ rect . . ImageShadowFilter . , component_ forwardingTargetForSelector: , component_ . component_ - ImageTransformFilter , . forwardingTargetForSelector: CGAffineTransform . component_ , ImageShadowFilter . , ImageTransformFilter , , . , , 166.

: .

, , . , .


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

छवि

167. , UIImage

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

छवि

168. , - UIImage

– , , 166. Shadow Transform , , , - 166. , , self component_ .

. BaseFilter , , , 1610.

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

BaseFilter , , 1611.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

. , , - Transform . Transform , CGAffineTransform . 1612.

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

, 1613.

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

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

Transform . , ? Shadow , , 1614.

1614. UIImage+Shadow.h
@interface UIImage (Shadow) - (UIImage *) imageWithDropShadow; @end

, Transform , ShadowUIImage , . , , Transform . , 1615.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 1616.

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

, , 168 . , imageWithTransform: , , ( ). imageWithDropShadow , , finalImage . finalImage imageView , . :

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

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

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

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

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

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

. - DecoratorViewController , viewDidLoad , 16–8.

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

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

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

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

: .

, , . , .


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

छवि

16–7. , UIImage

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

छवि

16–8. , - UIImage

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

. BaseFilter , , , 16–10.

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

BaseFilter , , 16–11.

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

beginContext – , . . , .

getImageFromCurrentImageContext UIGraphicsGetImageFromCurrentImageContext() .

endContext Quartz 2D UIGraphicsEndImageContext() - .

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

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

, 16–13.

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

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

Transform . , ? Shadow , , 16–14.

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

, Transform , ShadowUIImage , . , , 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 , ShadowUIImage , . , , 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 , ShadowUIImage , . , , Transform . , 16–15.

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

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

UIImag e. ? viewDidLoad DecoratorViewController , 16–16.

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

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

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

. , UIImage . .

Objective-C

– Objective-C, ( ) . . .

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

, , , . UIImag e , self UIImage .


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

, , . .

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


All Articles