2008-12-09 10 views
14

में प्रोग्रामेटिक रूप से रंगीन बबल/सर्कल बनाएं, क्या कोई मुझे रंगीन बबल/सर्कल प्रोग्रामेटिक रूप से बनाने के सही तरीके से मार्गदर्शन कर सकता है?ऑब्जेक्टिव और कोको

मैं छवियों का उपयोग नहीं कर सकता क्योंकि मुझे उपयोगकर्ता इंटरैक्शन के आधार पर कोई रंग होने में सक्षम होने की आवश्यकता है।

मेरा विचार शायद एक सफेद सर्कल छवि बनाने के लिए था और फिर इसके ऊपर एक रंग ओवरले करें। हालांकि मुझे यकीन नहीं है कि यह काम करेगा, या वास्तव में इसके बारे में कैसे जाना है।

अगर कोई मुझे सही दिशा बता सकता है तो मैं इसकी सराहना करता हूं।

उत्तर

11

एक एनएसवीव उप-वर्ग बनाएं जो एनएससीओलर को ivar के रूप में रखता है। DrawRect विधि में, दृश्य की सीमाओं का उपयोग करके उपयुक्त आकार का NSBezierPath बनाएं। फिर रंग [myColor set] सेट करें और पथ [myPath fill] भरें। आप बहुत कुछ कर सकते हैं, जैसे सेट पारदर्शिता, सीमा, और इसी तरह, लेकिन मैं इसे तब तक छोड़ दूंगा जब तक कि आपके पास कोई विशिष्ट प्रश्न न हो।

NSView सबक्लास का उपयोग करने के लिए, बस एक दृश्य ऑब्जेक्ट को अपने निब पर खींचें, और आईबी के इंस्पेक्टर में कस्टम क्लास में अपने उप-वर्ग का नाम चुनें। आपको अपने नियंत्रक में एक आउटलेट भी सेट करना होगा, ताकि आप आवश्यकतानुसार रंग बदल सकें।

+0

ऐसा लगता है कि यहां तक ​​कि है की तरह ए: BezierPathWithOvalInRect: धन्यवाद! – kdbdallas

+0

हाँ, अगर मुझे सही याद है तो यह तेंदुए में नया है। इससे पहले, पहली चीजों में से एक नेबी कोको प्रोग्रामर (स्वयं सहित) को एक परिपत्र या गोलाकार आयताकार पथ बनाने के लिए एनएसबीज़ियरपाथ में एक श्रेणी परिभाषित करना था। :) –

31

कोको में कुछ खींचने के लिए कुछ कदम हैं।

सबसे पहले आपको उस पथ की आवश्यकता है जिसका उपयोग उस ऑब्जेक्ट को परिभाषित करने के लिए किया जाएगा जिसे आप चित्रित करने जा रहे हैं। कोको में पथ बनाने के लिए यहां एक गाइड के लिए Drawing Fundamental Shapes पर एक नज़र डालें। "NSBezierPath" ऑब्जेक्ट में "appendBezierPathWithOvalInRect" संदेश भेजने में आपको सबसे अधिक दिलचस्पी होगी, यह एक आयत लेता है जो उस मंडल को बाध्य करता है जिसे आप आकर्षित करना चाहते हैं।

इस कोड को एक 10x10 चक्र पैदा करेगा पर 10,10 निर्देशांक:

NSRect rect = NSMakeRect(10, 10, 10, 10); 
NSBezierPath* circlePath = [NSBezierPath bezierPath]; 
[circlePath appendBezierPathWithOvalInRect: rect]; 

बार जब आप अपने पथ आप वर्तमान ड्राइंग संदर्भ के लिए रंग सेट करना चाहते हैं। दो रंग हैं, स्ट्रोक और भरें; स्ट्रोक पथ की रूपरेखा है और भरना आंतरिक रंग है। एक रंग सेट करने के लिए आप "सेट" को "एनएससीओलर" ऑब्जेक्ट में भेजते हैं।

यह काला करने के लिए स्ट्रोक और लाल रंग के भरण सेट:

[[NSColor blackColor] setStroke]; 
[[NSColor redColor] setFill]; 

अब आप अपने पथ है और आप अपने रंग सिर्फ सेट पथ भरें और फिर आकर्षित किया है:

[path stroke]; 
[path fill]; 

यह सब एक ग्राफिक्स संदर्भ में किया जाना चाहिए जैसे कि शायद एक दृष्टिकोण के drawRect में।एक साथ एक ग्राफिक्स संदर्भ के साथ यह सब इस प्रकार दिखाई देगा:

- (void)drawRect:(NSRect)rect 
{ 
    // Get the graphics context that we are currently executing under 
    NSGraphicsContext* gc = [NSGraphicsContext currentContext]; 

    // Save the current graphics context settings 
    [gc saveGraphicsState]; 

    // Set the color in the current graphics context for future draw operations 
    [[NSColor blackColor] setStroke]; 
    [[NSColor redColor] setFill]; 

    // Create our circle path 
    NSRect rect = NSMakeRect(10, 10, 10, 10); 
    NSBezierPath* circlePath = [NSBezierPath bezierPath]; 
    [circlePath appendBezierPathWithOvalInRect: rect]; 

    // Outline and fill the path 
    [circlePath stroke]; 
    [circlePath fill]; 

    // Restore the context to what it was before we messed with it 
    [gc restoreGraphicsState]; 
} 
+1

इस उत्तर में बहुत सारे वाक्यविन्यास गलत लगता है। क्या NSRect या NSGraphicsContext भी मौजूद है? –

+1

@EricBrotto मैं उत्तर के शीर्ष पर प्रदान किए गए लिंक पर पढ़ने की सलाह देता हूं। – joshperry

+0

मैकोज़ पर – Miek

7
CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(c, 40, 0, 255, 0.1); 
    CGContextSetRGBStrokeColor(c, 0, 40, 255, 0.5); 

    // Draw a green solid circle 
    CGContextSetRGBFillColor(c, 0, 255, 0, 1); 
    CGContextFillEllipseInRect(c, CGRectMake(100, 100, 25, 25)); 
+0

एक नोट: 'CGContextSetRGBFillColor' और' CGContextSetRGBStrokeColor' 0 से पैरामीटर लेता है -1.0, इसलिए आपको 8 बिट्स (0-255) में स्केल किए गए मानों का उपयोग नहीं करना चाहिए। – gklka

12

आप सरल UIView उपयोग कर सकते हैं केवल पैरामीटर radius साथ सही मंडली बनाने के लिए:

// Add framework CoreGraphics.framework 
#import <QuartzCore/QuartzCore.h> 

-(UIView *)circleWithColor:(UIColor *)color radius:(int)radius { 
    UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 2 * radius, 2 * radius)]; 
    circle.backgroundColor = color; 
    circle.layer.cornerRadius = radius; 
    circle.layer.masksToBounds = YES; 
    return circle; 
} 
+0

लाइन UIView * सर्कल = [[[UIView alloc] initWithFrame: CGRectMake (0, 0, 2 * त्रिज्या, 2 * त्रिज्या)] autorelease]; यदि आप एआरसी का उपयोग नहीं कर रहे हैं तो केवल ऑटोरेलीज़ का उपयोग करना सुनिश्चित करें। – tjpaul

+2

@tjsumpthun धन्यवाद, मैंने पोस्ट को अपडेट किया है (ऑटोरेलीज को हटाएं), मुझे लगता है कि लोग अब गैर आर्क विकास का उपयोग नहीं करते हैं। –

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