2010-06-15 11 views
10

मुझे आईफोन ऐप के साथ CGContext का उपयोग करके कुछ परेशानी हो रही है। मैं अलग-अलग रंगों के साथ कई रेखाएं खींचने की कोशिश कर रहा हूं, लेकिन सभी रेखाएं हमेशा रंग का अंत करती हैं जो आखिरी बार उपयोग की जाती थीं। मैंने कई दृष्टिकोणों की कोशिश की, लेकिन भाग्यशाली नहीं रहे हैं।आईफोन CGContext: दो अलग-अलग रंगों के साथ दो लाइनों को चित्रित करना

मैंने उस मुद्दे से निपटने के लिए एक छोटा सा नमूना प्रोजेक्ट स्थापित किया। यह मेरा कोड है, मैं drawRect विधि में उपयोग करता हूं।

- (void)drawRect:(CGRect)rect{ 
    NSLog(@"drawrect!"); 
    CGContextRef bluecontext = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(bluecontext, 2.0); 
    CGContextSetStrokeColorWithColor(bluecontext, [UIColor blueColor].CGColor); 
    CGContextMoveToPoint(bluecontext, 1, 1); 
    CGContextAddLineToPoint(bluecontext, 100, 100); 
    CGContextSetStrokeColorWithColor(bluecontext, [UIColor redColor].CGColor); 
    CGContextAddLineToPoint(bluecontext, 200, 100); 
    CGContextStrokePath(bluecontext); 
} 

आपकी मदद

उत्तर

22

सम्मिलित इस कोड को आप स्ट्रोक रंग दूसरी बार सेट होने के ठीक पहले के लिए धन्यवाद:: मैं एक लाल और एक नीली रेखा आकर्षित करने के लिए कोशिश कर रहा हूँ

CGContextStrokePath(bluecontext); 
CGContextBeginPath(bluecontext); 

सभी AddLine और AddOther कॉल पथ बना रहे हैं। मार्ग हाल ही में सेट रंगों और अन्य विशेषताओं का उपयोग करते हुए स्ट्रोकपैथ जैसे कॉल के साथ खींचा गया है। आप दो अलग-अलग पथ खींचने की कोशिश कर रहे हैं, इसलिए आपको प्रत्येक पथ के लिए शुरुआत और स्ट्रोक को कॉल करना होगा। जब आप ड्राइंग शुरू करते हैं तो शुरुआत शुरू होती है, हालांकि इसे स्वयं कॉल करने में कोई दिक्कत नहीं होती है। ड्राइंग का मूल प्रवाह है:

CGContextBeginPath(bluecontext); // clears any previous path 
// add lines, curves, rectangles, etc... 
CGContextStrokePath(bluecontext); // renders the path 
+0

धन्यवाद, तो यह मूल रूप से इस तथ्य की ओर नीचे चलाता है, मैं, एक रंग के साथ एक पथ प्रस्तुत करना है कि मैंने पहले एक और रंग के साथ एक रास्ता खींचो? दो संदर्भ बनाना, नीली रेखाओं के लिए एक और लाल वालों के लिए एक काम नहीं करता है, क्योंकि वे अंत में एक ही संदर्भ का उपयोग कर रहे हैं? – phonecoddy

+2

हां, रंग में प्रत्येक बदलाव के लिए आपको पथ खींचना होगा और इसे साफ़ करना होगा। आप इसे एक ही संदर्भ में कर सकते हैं। – drawnonward

2

मुझे लगता है कि यह काम कर सकता है।

CGContextRef bluecontext = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(bluecontext, 2.0); 
CGContextSetStrokeColorWithColor(bluecontext, [UIColor blueColor].CGColor); 
CGContextMoveToPoint(bluecontext, 1, 1); 
CGContextAddLineToPoint(bluecontext, 100, 100); 

CGContextStrokePath(bluecontext); // draw blue line 


CGContextSetStrokeColorWithColor(bluecontext, [UIColor redColor].CGColor); 
CGContextAddLineToPoint(bluecontext, 200, 100); 

CGContextStrokePath(bluecontext); // and draw red line 
12

आपको जो चाहिए वह है।

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextClearRect(context, rect); 
CGContextSetLineWidth(context, 2.0); 

CGContextBeginPath(context); 
CGContextSetStrokeColorWithColor(context, [UIColor orangeColor].CGColor); 
CGContextMoveToPoint(context, 1, 1); 
CGContextAddLineToPoint(context, 100, 100); 
CGContextStrokePath(context); // and draw orange line} 

CGContextBeginPath(context); 
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
CGContextMoveToPoint(context, 100, 100); 
CGContextAddLineToPoint(context, 200, 100);  
CGContextStrokePath(context); // draw blue line 
1

आप जिस तरह से यह एक पाश में लग रहा है में रुचि रखते हैं:

- (void)drawRect:(CGRect)rect {   
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 2.0); 

    CGPoint startingPoint = [[pointsArray objectAtIndex:0] CGPointValue]; 
    CGContextMoveToPoint(context, startingPoint.x, startingPoint.y); //start at this point 

    for (int i = 1; i < [pointsArray count]; i++) { 
     CGContextBeginPath(context); 
     //start at the previous point 
     CGContextMoveToPoint(context, 
       [[pointsArray objectAtIndex:i-1] CGPointValue].x, 
       [[pointsArray objectAtIndex:i-1] CGPointValue].y); 

     CGPoint point = [[pointsArray objectAtIndex:i] CGPointValue]; 
     if (point.y < 50) { // if y is less then 50 use red color 
      CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
     } else { // else use blue color 
      CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 

     } 
     CGContextAddLineToPoint(context, point.x, point.y); //draw to this point 
     CGContextStrokePath(context); 
    } 
} 
+0

आपके उत्तर में रूपांतरित क्या है? –

+0

अच्छा बिंदु, हास्यास्पद कैसे 3 साल बीत चुके हैं और कोई भी उससे पूछने के लिए सोचा नहीं। मुझे पूरा यकीन है कि आप "transformedPoint" की जगह "पॉइंट" का उपयोग कर सकते हैं। मैं इसे सत्यापित करने के लिए आज बाद में परीक्षण करूंगा। @Mady –

+0

मैंने कोड को फिर से जांचते समय कल यह किया है .... लेकिन धन्यवाद –

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