आप स्ट्रोक के घटाया पथ चाहते हैं, आप अपने दम पर कर रहे हैं। ऐप्पल एक एपीआई प्रदान नहीं करता है जो दूसरे से एक पथ के घटाव (या केवल स्ट्रोक) देता है।
यदि आप केवल घटाए गए पथ को भरना चाहते हैं (जैसा कि आपकी उदाहरण छवि में है), तो आप इसे क्लिपिंग पथ का उपयोग करके कर सकते हैं। हालांकि, आपको एक चाल का उपयोग करना होगा। जब आप क्लिपिंग पथ पर पथ जोड़ते हैं, तो नया क्लिपिंग पथ पुराने क्लिपिंग पथ और अतिरिक्त पथ के चौराहे है। तो यदि आप क्लिपिंग पथ पर smallMaskPath
जोड़ते हैं, तो आप केवल smallMaskPath
के अंदर क्षेत्र भरने को समाप्त कर देंगे, जो आप चाहते हैं के विपरीत है।
आपको क्या करना है smallMaskPath
के साथ मौजूदा क्लिपिंग पथ को अलग करना है। सौभाग्य से, आप उस अजीब घुमावदार नियम का उपयोग करके आसानी से ऐसा कर सकते हैं। आप Quartz 2D Programming Guide में भी अजीब नियम के बारे में पढ़ सकते हैं।
मूल विचार यह है कि हम दो उपपथों के साथ एक कंपाउंड पथ बनाते हैं: आपके smallMaskPath
और एक विशाल आयताकार जो आपके smallMaskPath
और हर दूसरे पिक्सेल को पूरी तरह से संलग्न करता है जिसे आप भरना चाहते हैं। अजीब नियम के कारण, smallMaskPath
के अंदर प्रत्येक पिक्सेल को यौगिक पथ के बाहर के रूप में माना जाएगा, और smallMaskPath
के बाहर प्रत्येक पिक्सेल को यौगिक पथ के अंदर माना जाएगा।
तो चलिए इस यौगिक पथ को बनाते हैं। हम विशाल आयत से शुरू करेंगे।
[clipPath appendPath:smallMaskPath];
अगला हम even- उपयोग करने के लिए पथ सेट: यह करने के लिए smallMaskPath
जोड़कर
UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectInfinite];
अब हम यह एक यौगिक पथ में बनाना: और अनंत आयत से कोई आयत अधिक विशाल है अजीब नियम:
clipPath.usesEvenOddFillRule = YES;
इससे पहले कि हम इस पथ पर क्लिप, हम ग्राफिक्स राज्य ताकि हम कतरन पथ के लिए परिवर्तन पूर्ववत कर सकते हैं बचाने के लिए करना चाहिए जब यह पूरा हो:
CGContextSaveGState(UIGraphicsGetCurrentContext()); {
अब हम कतरन पथ को संशोधित कर सकते हैं:
[clipPath addClip];
और हम bigMaskPath
भर सकते हैं:
[[UIColor orangeColor] setFill];
[bigMaskPath fill];
अंत में हम ग्राफिक्स राज्य बहाल, कतरन पथ के लिए परिवर्तन नाश:
} CGContextRestoreGState(UIGraphicsGetCurrentContext());
यहां सह है डी सब एक साथ आप प्रतिलिपि बनाना चाहते मामले में/चिपकाएं:
UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectInfinite];
[clipPath appendPath:smallMaskPath];
clipPath.usesEvenOddFillRule = YES;
CGContextSaveGState(UIGraphicsGetCurrentContext()); {
[clipPath addClip];
[[UIColor orangeColor] setFill];
[bigMaskPath fill];
} CGContextRestoreGState(UIGraphicsGetCurrentContext());
के लिए परीक्षण खेल का मैदान तैयार कर सकते हैं इस से की जरूरत है जिस तरह से अधिक काम है। आंतरिक और बाहरी राउंड्रेक्ट्स युक्त पथ बनाना और इसे अजीब नियम से भरना आसान है। आपको क्लिप पथ पर कुछ भी करने की आवश्यकता नहीं है। – NSResponder
आपका जवाब सरल है जब छोटे मास्कपैथ को बड़े पैथमास्क द्वारा पूरी तरह से निहित किया गया है, जैसा कि जेडन 10 के उदाहरण में है। सामान्य मामले में जहां छोटे मास्कपैथ में बड़े मास्कपैथ के बाहर पिक्सल भी शामिल होते हैं, आपका सरल दृष्टिकोण काम नहीं करेगा। –
मुझे वह स्टाइल पसंद है जिसका उपयोग आप ब्रेस्ट के बीच जीस्टेट डालने के लिए करते हैं !! – To1ne