2013-01-10 47 views
5

कोर ग्राफिक्स के साथ, क्या पथ के अंदर स्ट्रोक करना संभव है? लाइन वजन के विपरीत बाहर और आधे हिस्से में एक स्ट्रोक पथ के अंदर आधा खींचा जा रहा है?UIView drawRect: क्या पथ के अंदर स्ट्रोक करना संभव है?

कारण किया जा रहा है यह स्ट्रोक के दृश्य मोटाई को नियंत्रित करने के लिए आसान हो सकता है अगर कहते हैं कि एक दृश्य का हिस्सा स्क्रीन बढ़त और ओर से नहीं है। स्क्रीन एज पर हिस्सा काट दिया जाता है, जबकि स्क्रीन पर पूरी तरह से दृश्य किनारे मोटे लगते हैं (जैसे दोनों स्ट्रोक दिखाई दे रहे हैं)।

enter image description here

उत्तर

10

इससे पहले कि आप पथ के लिए क्लिप यह स्ट्रोक।

+0

धन्यवाद! क्या आप उपरोक्त मेरे "उत्तर" को देख सकते हैं और टिप्पणी कर सकते हैं। यह विधि काफी काम नहीं करती है। स्ट्रोक बिल्कुल नहीं खींचता है। पथ के लिए क्लिप क्या है, विधि का नाम? – Mrwolfy

+0

आप करीब हैं। [ 'CGContextClip()' के लिए दस्तावेज़] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextClip) का कहना है : "नया क्लिपिंग पथ निर्धारित करने के बाद, फ़ंक्शन संदर्भ के वर्तमान पथ को खाली पथ पर रीसेट करता है।" यह बताता है कि क्यों 'CGContextDraw' कुछ भी नहीं खींचता है - आपको स्ट्रोक करने से पहले संदर्भ में पथ को फिर से जोड़ना होगा। –

+0

एक [ 'CGPath'] (https://developer.apple.com/library/ios/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html#//apple_ref/c/tdef/CGPathRef) या [का उपयोग करना 'UIBezierPath'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html) उस प्रक्रिया को आसान बना देगा - आप एक बार पथ बना सकते हैं, फिर उपयोग करें यह दो बार –

6

यह कोई स्ट्रोक ड्रॉ:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect), CGRectGetHeight(rect)); 
    CGFloat radius = 30; 
    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect); 
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
    CGContextClip(context); 
    CGContextDrawPath(context, kCGPathStroke); 
} 

संपादित करें: यह क्या (सही जवाब के अनुसार) में काम किया है:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect pathRect = CGRectMake(10, 10, rect.size.width -20, rect.size.height -20); 
    CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:pathRect cornerRadius:20].CGPath; 
    CGContextAddPath(context, path); 
    CGContextClip(context); 
    CGContextAddPath(context, path); 
    CGContextDrawPath(context, kCGPathEOFillStroke); 

} 

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

  • कोई संबंधित समस्या नहीं^_^