2013-02-12 65 views
8

एनबी पर एक परत को घुमाने के लिए 10.8 पर एंकरपॉइंट सेट करें एनबी: यह ओएस एक्स पर एक कोको ऐप के लिए है, आईओएस नहीं।कोर एनीमेशन: अपने केंद्र

मेरे पास एक परत समर्थित एनएसबटन (एनएसवी व्यू का उप-वर्ग) है। मैं क्या करना चाहता हूं कोर एनीमेशन का उपयोग करके उस बटन को घुमाएं। मैं यह करने के लिए निम्न कोड का उपयोग कर रहा:

CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
a.fromValue = [NSNumber numberWithFloat:0]; 
a.toValue = [NSNumber numberWithFloat:-M_PI*2]; 
[_refreshButton.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
a.duration = 1.8; // seconds 
a.repeatCount = HUGE_VAL; 
[_refreshButton.layer addAnimation:a forKey:nil]; 

यह काम करता है सिवाय इसके कि जब यह चलता है, परत कूदता नीचे और के लिए छोड़ दिया ताकि उसके केंद्र बिंदु NSView, के मूल बिंदु पर है जो (0,0) पर निचला बायां कोने है। परत तब उसके केंद्र के बारे में घूमती है, लेकिन जाहिर है कि कूद-से-निचले-बाएं कोने को स्वीकार्य नहीं है।

तो, बहुत पढ़ने के बाद, मैं 10.8 एपीआई रिलीज़ नोट में इस लाइन पाया:

On 10.8, AppKit will control the following properties on a CALayer 
(both when "layer-hosted" or "layer-backed"): geometryFlipped, bounds, 
frame (implied), position, anchorPoint, transform, shadow*, hidden, 
filters, and compositingFilter. Use the appropriate NSView cover methods 
to change these properties. 

इसका मतलब है कि AppKit "अनदेखी" है मेरे कॉल उपरोक्त कोड में -setAnchorPoint और इसके बजाय, के लिए, है एनएसवीव के मूल (0,0) को एंकर पॉइंट सेट करना।

मेरा सवाल है: मैं इसे कैसे हल करूं? परत के लिए एंकरपॉइंट सेट करने के लिए "उपयुक्त NSView कवर विधि" क्या है (मुझे NSView पर ऐसी कोई विधि नहीं मिल सकती है)। दिन के अंत में, मैं चाहता हूं कि मेरा बटन अनिश्चित काल तक अपने केंद्र बिंदु के चारों ओर घुमाए।

उत्तर

15

मुझे NSView पर कोई भी विधि दिखाई नहीं दे रही है जो anchorPoint के लिए प्रत्यक्ष "कवर" है।

क्या मैं the 10.8 release notes में देख पा रहे हैं, तो आप क्या उद्धृत के अलावा, यह है:

anchorPoint भी हमेशा के लिए सेट है (0,0), ...

anchorPoint नियंत्रण जो सुपरलेयर के समन्वय प्रणाली में परत का बिंदु position पर है। NSViewself.layer.anchorPoint से (0,0) सेट करता है, जिसका अर्थ है कि परत का निचला बायां कोने self.layer.position पर है।

जब आप anchorPoint से (0.5,0.5) सेट करते हैं, तो इसका मतलब है कि परत का केंद्र परत के position पर होना चाहिए। चूंकि आपने position को संशोधित नहीं किया है, इसलिए आप परत को नीचे और बाईं ओर ले जाने का प्रभाव डाल रहे हैं, जैसा कि आप देख रहे हैं।

आप की गणना करने की जरूरत है position आप परत चाहते हैं जब अपने anchorPoint है (0.5,0.5) के लिए, इस तरह:

CGRect frame = _refreshButton.layer.frame; 
CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)); 
_refreshButton.layer.position = center; 
_refreshButton.layer.anchorPoint = CGPointMake(0.5, 0.5); 
+0

बिल्कुल सही! तुम्हे पता हैं; मैंने स्थिति की संपत्ति देखी लेकिन इसे कोशिश नहीं की क्योंकि मैंने ऊपर दिए गए नोट को पढ़ा है जो कहता है कि ऐपकिट इसे नियंत्रित करने जा रहा है। समाधान के लिए धन्यवाद! – Bryan

+0

कोई विचार क्यों रोटेशन M_PI/2 उसके बाद पहली बार घड़ी के विपरीत घुमाएगा? – greg

+0

मुझे आपका कोड देखना होगा। आपको अपना प्रश्न पोस्ट करना चाहिए। –

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

  • कोई संबंधित समस्या नहीं^_^