2012-09-11 15 views
16

Xcode में एक ओएस एक्स अनुप्रयोग के टेम्पलेट के बाद एक खाली एप्लिकेशन टेम्पलेट के समान प्रतीत हो रहा है, के बाद एक दृश्य और एक बटन (अब के लिए इंटरफ़ेस बिल्डर का उपयोग नहीं करने की कोशिश कर रहा) जोड़ने के लिए प्रयोग किया जाता है:कोको ऐप में एनएसविंडो में एनएसवी व्यू कैसे जोड़ें?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{  
    NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 

    view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

    [self.window.contentView addSubview:view]; 

    NSRect frame = NSMakeRect(10, 40, 90, 40); 
    NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
    pushButton.bezelStyle = NSRoundedBezelStyle; 

    [self.window.contentView addSubview:pushButton]; 

    NSLog(@"subviews are %@", [self.window.contentView subviews]); 
} 

आईओएस पर इसी तरह के कोड को पीले बॉक्स और एक बटन का उत्पादन करना चाहिए था, लेकिन ऊपर दिया गया कोड केवल एक बटन उत्पन्न करता है, लेकिन दृश्य नहीं दिखाया जाएगा। क्या ऊपर दिए गए कोड में कुछ गड़बड़ है, और इसे पीले रंग की पृष्ठभूमि के साथ दृश्य कैसे दिखाना है?

उत्तर

16

एनएसवी व्यू कक्षा के setWantsLayer: विधि का उपयोग करें।

NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 
[view setWantsLayer:YES]; 
view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

[self.window.contentView addSubview:view]; 

NSRect frame = NSMakeRect(10, 40, 90, 40); 
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
pushButton.bezelStyle = NSRoundedBezelStyle; 

[self.window.contentView addSubview:pushButton]; 

NSLog(@"subviews are %@", [self.window.contentView subviews]); 
+0

NSView में पृष्ठभूमि नहीं है रंग संपत्ति, ऐसा लगता है। मैं मिस 'UIKit' याद आती है ...! –

+5

यह उत्तर खराब है। आप [स्पष्ट रूप से बताया गया है] (http://developer.apple।कॉम/लाइब्रेरी/मैक/प्रलेखन/कोको/संदर्भ/एप्लिकेशनकिट/कक्षाएं/NSView_Class/संदर्भ/NSView.html # // apple_ref/doc/uid/20000014-SW61) परत-समर्थित दृश्य में बैकिंग परत को स्पर्श न करें (ए देखें कि आपने '-setWantsLayer:' को कॉल किए बिना '-setLayer:' पहले) का उपयोग किया था। दस्तावेज़ों से: ** लेयर बैक किए गए विचारों का उपयोग करते समय आपको कभी भी परत ** –

+0

के साथ सीधे बातचीत नहीं करनी चाहिए, इसका मतलब है कि पहले एक कैलियर को तुरंत चालू करना चाहिए, इसे देखने के लिए सेट करें। प्लेयर, और उसके बाद चाहें लेयर को YES पर सेट करें, और पृष्ठभूमि रंग सेट करें ? –

5

NSView कोको में डिफ़ॉल्ट रूप से, परत-समर्थित नहीं हैं। मुझे लगता है कि अगर आप टाइप

NSLog(@"%@", view.layer); 

आप देखेंगे कि यह nil है देखेंगे।

आईओएस में, सभी विचारों में परतें होती हैं। लेकिन ओएस एक्स पर, विचारों में परतें नहीं हैं। इसके अलावा, ओएस एक्स पर परत-समर्थित विचारों के 2 "मोड" हैं। वहां "परत-समर्थित दृश्य" और "परत-होस्टिंग दृश्य" कहा जाता है। एक परत-समर्थित दृश्य कोर डेटा को कैश करने के लिए कोरएनीमेशन परत का उपयोग करता है, लेकिन आपको किसी भी तरह से परत से बातचीत करने की अनुमति नहीं है। एक लेयर-होस्टिंग व्यू CALayer का उपयोग करता है जिसे आप स्पष्ट रूप से प्रदान करते हैं, और आप उस परत के साथ गड़बड़ कर सकते हैं जो आप चाहते हैं। हालांकि, एक परत-होस्टिंग दृश्य के साथ आप कोई सबव्यूव नहीं जोड़ सकते हैं, या अंतर्निहित NSView ड्राइंग तंत्र का उपयोग कर सकते हैं। एक परत-होस्टिंग दृश्य केवल कोरएनीमेशन परत पदानुक्रम की जड़ के रूप में उपयोग किया जाना चाहिए।

यह सब देखते हुए, आपको शायद अपने विचार के लिए कोरएनीमेशन का उपयोग करना चाहिए।

यह संभव है कि NSBox जो भी आप चाहते हैं वह करेगा। आप निश्चित रूप से वहां एक भरने का रंग सेट कर सकते हैं, सीमा बंद कर सकते हैं, और स्टाइल को कस्टम पर सेट कर सकते हैं। मैं सिर्फ 100% निश्चित नहीं हूं कि यह रंग के एक साधारण भरे आयत के रूप में आकर्षित होगा। वैकल्पिक रूप से आप अपने NSView सबक्लास को परिभाषित कर सकते हैं जो -drawRect: में रंग खींचता है।

+0

आप जानते हैं कि कैसे एक पीले रंग की पृष्ठभूमि के साथ दृश्य शो बनाने के लिए करते हैं: NSRectFill एक बेज़ियर पथ बनाए बिना एक आयत को भरने के लिए एक बहुत ही सुविधाजनक समारोह है? –

+0

@ जेरेमीएल: मैं अभी शोध कर रहा हूं। मैं मुख्य रूप से आईओएस करता हूं, इसलिए कृपया इसे दबाएं। –

+0

@ जेरेमीएल, मैं हमेशा केविन के रूप में उल्लेख करता हूं, कस्टम दृश्य के बजाय एनएसबीक्स का उपयोग करता हूं। बस अपना प्रकार कस्टम पर सेट करें, और फिर आप (आईबी या कोड में) अपने पृष्ठभूमि रंग, एक सीमा रंग (या यदि आप चुनते हैं तो कोई सीमा नहीं) सेट कर सकते हैं, और यदि आप चाहें तो गोल कोनों को सेट कर सकते हैं। – rdelmar

5

केविन बेलार्ड द्वारा सुझाव पर विस्तार करने के लिए, यह करने के लिए बढ़िया तरीका NSView उपवर्ग और -drawRect: विधि ओवरराइड करने के लिए है।

- (void)drawRect:(NSRect)rect 
{ 
    [[NSColor yellowColor] set]; 
    NSRectFill(rect); 
} 
संबंधित मुद्दे