2012-09-13 40 views
9

मैं ओएस एक्स के लिए Xcode पर एक खाली कोको एप्लिकेशन बनाया है, और कहा:NSView को अपने बाउंडिंग क्षेत्र को क्लिप करने के लिए कैसे करें?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)]; 
    self.view.wantsLayer = YES; 
    self.view.layer = [CALayer layer]; 
    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 1, 1, 1); 

    [self.window.contentView addSubview:self.view]; 
} 

लेकिन घुमाया परत की पृष्ठभूमि दृश्य का सीमांकन क्षेत्र से काटा जाता है:

enter image description here

मैं कुछ के बाद से सोचा ओएस एक्स और आईओएस का संस्करण, दृश्य इसके सबव्यूज़ की सामग्री को क्लिप नहीं करेगा और सबकुछ अंदर और बाहर दिखाएगा? आईओएस पर, मुझे वह व्यवहार दिखाई देता है, लेकिन मुझे आश्चर्य है कि यह ऐसा क्यों दिखता है और सबकुछ कैसे दिखाया जाए? (मैं पहले से ही माउंटेन शेर पर सबसे वर्तमान एक्सकोड 4.4.1 का उपयोग कर रहा हूँ)।

(ध्यान दें: यदि आप कोड ऊपर का प्रयास करें, आप, हालांकि मुझे आश्चर्य है कि क्यों मैं हैडर आयात नहीं किया और यह अभी भी पूरी तरह से संकलित क्वार्ट्ज कोर से लिंक है, और संभवतः क्वार्ट्ज कोर हैडर आयात करने के लिए की आवश्यकता होगी)

उत्तर

10

ऐसा लगता है कि लाइन यदि:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    ((NSView *)self.window.contentView).wantsLayer = YES; 

    self.view = [[NSView alloc] initWithFrame:NSMakeRect(200, 200, 200, 200)]; 

    self.view.wantsLayer = YES; 

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

    [self.window.contentView addSubview:self.view]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 

    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 0, 0, 1); 

} 

तो यह की तरह है, तो सभी दृश्यों बना रहे हैं लग रहा है:

((NSView *)self.window.contentView).wantsLayer = YES; 

बहुत शुरुआत में जोड़ा जाता है, तो यह अपेक्षा के अनुरूप काम करता है परत समर्थित होने के लिए, यह वही काम करता है जैसा यह आईओएस पर करता है। (यदि सभी विचार परत स्वचालित रूप से बैक अप लेने का एक त्वरित तरीका है, तो यह अच्छा होगा)।

anchorPoint लाइन addSubview लाइन से पहले स्थानांतरित नहीं किया जा सकता है, अन्यथा यह गलत है, हालांकि मुझे आश्चर्य है कि इससे कोई फर्क क्यों पड़ता है।

self.view.layer = [CALayer layer]; को हटाया जा सकता है यदि window.contentView परत समर्थित है। सामग्री दृश्य और self.view दोनों परत सेट करने की आवश्यकता नहीं है, और मुझे आश्चर्य है कि क्यों भी।

transform लाइन addSubview लाइन से पहले नहीं हो सकती है, अन्यथा यह घुमाएगी नहीं, और मुझे आश्चर्य है कि क्यों।

तीसरे बात यह है कि, मैंने सोचा कि अगर मैं बिल्डर इंटरफेस और contentView ContentView के एक वर्ग (NSView उपवर्गीकरण) बनाने के लिए जाना है, और उसके init विधि में, एक self.wantsLayer = YES; करते हैं, तो यह भी काम करेगा, लेकिन यह करता है नहीं।

लेकिन वैसे भी, उपर्युक्त कोड काम करता है, और मैं उपरोक्त कारणों को अपडेट करूंगा, जब मुझे और अधिक पता चलता है।

enter image description here

+0

मैं आईओएस डेवलपर हूं और मैंने हाल ही में कोको में काम करना शुरू कर दिया है। यह पिछले तीन दिनों से मुझे पागल कर रहा है। मुझे आश्चर्य है कि मुझे इसके बारे में अधिक जानकारी नहीं मिल रही है। अपना समाधान पोस्ट करने के लिए धन्यवाद !! – KevinM

+0

जब आप परतों के बिना परतों और किसी के साथ NSView मिश्रण करते हैं तो समस्याएं हो सकती हैं। यह स्थिर नहीं है कि कौन सी सामग्री दूसरों पर ओवरले होगी। – Slavik

+1

'self.wantsLayer = YES' सेट करना' init' में काम नहीं करता है क्योंकि 1. सही प्रारंभकर्ता 'initWithFrame:' और 2. है, यहां तक ​​कि इसे nibs से लोड किए गए दृश्यों के लिए भी नहीं कहा जाता है। आपको '-awakeFromNib' ओवरराइड करना चाहिए और वहां अपना सेटअप करना चाहिए। वैकल्पिक रूप से, आप आईबी के व्यू इफेक्ट इंस्पेक्टर में कोर एनीमेशन लेयर प्रॉपर्टी सेट कर सकते हैं। –