2012-11-23 20 views
13

नीचे दिया गया कोड अच्छी तरह से एक गोलाकार आयत बनाता है जिसे सीजीआरईटी (रेक्ट्रैक्ट) द्वारा परिभाषित किया गया है।इसे भरने के बाद पथ को स्ट्रोक नहीं कर सकता

यह ठीक हो जाता है, लेकिन मुझे स्ट्रोक नहीं मिल रहा है। कोई विचार क्यों मैं स्ट्रोक नहीं देख सकता?

-(void)drawRect:(CGRect)rect { 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGContextSetRGBFillColor(ctx, 0, 0, 0, 0.4); 
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1); 
    CGContextSetLineWidth(ctx, 4.0); 

    float fw, fh; 
    rect = rectRect; 
    float ovalWidth = 12; 
    float ovalHeight = 12; 

    if (ovalWidth == 0 || ovalHeight == 0) { 
     CGContextAddRect(ctx, rect); 
     return; 
    } 

    CGContextTranslateCTM (ctx, CGRectGetMinX(rect), CGRectGetMinY(rect)); 
    CGContextScaleCTM (ctx, ovalWidth, ovalHeight); 
    fw = CGRectGetWidth (rect)/ovalWidth; 
    fh = CGRectGetHeight (rect)/ovalHeight; 
    CGContextMoveToPoint(ctx, fw, fh/2); 
    CGContextAddArcToPoint(ctx, fw, fh, fw/2, fh, 1); 
    CGContextAddArcToPoint(ctx, 0, fh, 0, fh/2, 1); 
    CGContextAddArcToPoint(ctx, 0, 0, fw/2, 0, 1); 
    CGContextAddArcToPoint(ctx, fw, 0, fw, fh/2, 1); 
    CGContextClosePath(ctx); 

    CGContextFillPath(ctx); 
    CGContextStrokePath(ctx); 

} 

उत्तर

44

आप एक पथ रंग है, या तो यह पथपाकर द्वारा या इसे भर कर, ग्राफिक्स संदर्भ खाली करने के लिए अपने रास्ते रीसेट करता है। तो आप CGContextFillPath पर कॉल करने के बाद, संदर्भ में स्ट्रोक का मार्ग नहीं है।

CGContextDrawPath(ctx, kCGPathFillStroke); 

kCGPathFillStroke निरंतर कोर ग्राफिक्स बताता पथ भरें और फिर करने के लिए यह स्ट्रोक:

इसके बजाय पथ को भरने के लिए और फिर स्ट्रोक यह, आप CGContextDrawPath समारोह एक कॉल में दोनों का उपयोग कर सकते कोशिश कर के

दूसरी ओर, आप UIBezierPath और UIColor का उपयोग कोड की मात्रा काफी हद तक कम करने के लिए कर सकते हैं:

-(void)drawRect:(CGRect)rect { 
    [[UIColor colorWithWhite:0 alpha:0.4] setFill]; 
    [[UIColor whiteColor] setStroke]; 

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectRect cornerRadius:12]; 
    path.lineWidth = 4; 
    [path fill]; 
    [path stroke]; 
} 
+1

धन्यवाद। यह वही है जिसे मैं देख रहा था। – Mrwolfy

+0

ओह, वैसे, UIBezierPath विकल्प उच्च प्रदर्शन फ़िक्स है? यह बिल्कुल बिल्कुल काम करता है। या मुझे कहीं और दिखना चाहिए। – Mrwolfy

+0

प्रदर्शन के बारे में चिंता न करें जब तक कि उपकरण आपको बताए कि आपकी बाधाएं कहां हैं। –