2012-06-13 13 views
6

में (एक छेद काटने) मैं एक iPhone आवेदन है और मैं निम्न विधि लागू करने की आवश्यकता:UIView पर स्पष्ट रंग के साथ बैठक स्थिर विधि

+(UITextView *)textView:(UITextView *) withCuttedRect:(CGRect)r 

इस विधि में कटौती करना होगा ([UIColor clearColor] से भरना) रेक्ट rUITextView से और UITextView ऑब्जेक्ट लौटाएं।

उपयोगकर्ता कटा हुआ छेद से UITextView के पीछे दृश्य देखेंगे।

यह कैसे किया जा सकता है?

+0

शायद "एक पथ भरने" द्वारा disused है मुझे क्वार्ट्जकोर और इसका 'सेटबैकग्राउंड' फ़िल्टर विधि का उपयोग करना चाहिए? – user1385666

उत्तर

5

जब आप की तरह कुछ होगा: आप वास्तव में बस

textView.layer 

क्या आप तो कर सकते हैं कतरन के लिए एक मुखौटा सेट किया गया है करने के लिए के साथ मुख्य एनीमेशन से TextView की परत का उपयोग कर सकते

+(UITextView *)textView:(UITextView *)textView withCuttedRect:(CGRect)r { 
} 

। ये मास्क निम्न तरीके से काम करते हैं: आप आम तौर पर एक काला आकार खींचते हैं, और यह वही रहता है, बाकी को फिसल जाएगा (ठीक है, आप वास्तव में अल्फा चैनल पर कुछ चीजें भी कर सकते हैं लेकिन मोटे तौर पर यह है)।

तो आपको आयत के रूप में एक आयत के रूप में एक काले आयताकार की आवश्यकता है, जो कि आयताकार के भीतर एक आयताकार है। उसके लिए आपको लगभग

CAShapeLayer *mask = [[CAShapeLayer alloc] init]; 
mask.frame = self.textView.layer.bounds; 
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height); 
CGRect smallerRect = CGRectMake(50.0f, 50.0f, 10.0f, 10.0f); 

UIBezierPath *maskPath = [UIBezierPath bezierPath]; 
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))]; 

[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))]; 

mask.path = maskPath.CGPath; 
[mask setFillRule:kCAFillRuleEvenOdd]; 
mask.fillColor = [[UIColor blackColor] CGColor]; 
self.textView.layer.mask = mask; 

कर सकते हैं कोड ऊपर भी Crop a CAShapeLayer retrieving the external path

विचार क्यों कि भरने से काम करता है कि जिस तरह से अच्छी तरह से खंड में Quartz 2D Programming Guide से समझाया गया है

+0

अच्छा! और सिर्फ एक नोट, 'CGContext' के साथ ऐसा करने के लिए, आप पथ को वही जोड़ते हैं जैसा आपने किया था, और फिर आप इसे' CGContextEOFillPath (संदर्भ) 'से भरें। :) जहां ईओ का अर्थ अजीब है, एंडऑफफाइल के साथ उलझन में नहीं होना चाहिए (जिस तरह से यह मेरे लिए स्कैन करता है)। –

+1

आप मूल '[UIBezierPath bezierPath] 'के बजाय' [UIBezierPath bezierPathWithRect: biggerRect] 'का उपयोग कर कोड की कुछ पंक्तियों को ट्रिम कर सकते हैं। यह maskPath को bigRect pre-added के साथ प्रारंभ करेगा। दूसरी तरफ जोड़ने के लिए आपको केवल moveToPoint: और addLineToPoint का उपयोग करने की आवश्यकता है। –

संबंधित मुद्दे