2011-05-19 27 views
7

मैं मूल एनीमेशन का उपयोग कर NSView में स्लाइड करने की कोशिश कर रहा हूं। मुझे लगता है कि मुझे [[view animator] setFrame:newFrame] जैसे कुछ पर भरोसा करने के बजाय स्पष्ट एनीमेशन का उपयोग करने की आवश्यकता है। यह मुख्य रूप से इसलिए है क्योंकि एनीमेशन समाप्त होने के बाद कार्रवाई करने के लिए मुझे एनीमेशन प्रतिनिधि सेट करने की आवश्यकता है।कोर एनीमेशन का उपयोग करके एनएसवी व्यू की स्पष्ट एनीमेशन

मैंने एनिमेटर का उपयोग करके बस ठीक काम किया है, लेकिन जैसा कि मैंने कहा, एनीमेशन खत्म होने पर मुझे अधिसूचित होने की आवश्यकता है। मेरे कोड वर्तमान में लगता है कि:

// Animate the controlView 
NSRect viewRect = [controlView frame]; 
NSPoint startingPoint = viewRect.origin; 
NSPoint endingPoint = startingPoint; 
endingPoint.x += viewRect.size.width; 
[[controlView layer] setPosition:NSPointToCGPoint(endingPoint)]; 

CABasicAnimation *controlPosAnim = [CABasicAnimation animationWithKeyPath:@"position"]; 
[controlPosAnim setFromValue:[NSValue valueWithPoint:startingPoint]]; 
[controlPosAnim setToValue:[NSValue valueWithPoint:endingPoint]]; 
[controlPosAnim setDelegate:self]; 
[[controlView layer] addAnimation:controlPosAnim forKey:@"controlViewPosition"]; 

यह नेत्रहीन काम करता है (और मैं अंत में सूचित कर दिया है), लेकिन ऐसा लगता है जैसे वास्तविक controlView ले जाया नहीं हो लग रहा है। अगर मैं खिड़की को ताज़ा करने का कारण बनता हूं, तो नियंत्रण दृश्य गायब हो जाता है। मैं

[controlView setFrame:newFrame]; 

साथ

[[controlView layer] setPosition:NSPointToCGPoint(endingPoint)]; 

की जगह की कोशिश की और कहा कि स्थानांतरित करने के लिए दृश्य (और परत) का कारण है, लेकिन यह कुछ इस तरह है कि मेरे ऐप उसके तुरंत बाद एक SEG गलती से मर जाता है भ्रष्ट है।

स्पष्ट एनीमेशन के अधिकांश उदाहरण केवल CALayer पर जा रहे हैं। NSView को स्थानांतरित करने और एक प्रतिनिधि सेट करने में सक्षम होने का एक तरीका होना चाहिए। किसी भी सहायता की सराहना की जाएगी।

उत्तर

5

मुझे लगता है कि आपको अंत में सेटपॉजिशन (एनीमेशन सेट करने के बाद) कॉल करने की आवश्यकता है। इसके अलावा, मुझे नहीं लगता कि आपको स्पष्ट रूप से दृश्य की परत को एनिमेट करना चाहिए, लेकिन इसके बजाय एनिमेटर का उपयोग करके और एनिमेशन को सेट करके स्वयं को देखें। आप एनिमेटर के साथ प्रतिनिधियों का भी उपयोग कर सकते हैं :)

// create controlPosAnim 
[controlView setAnimations:[NSDictionary dictionaryWithObjectsAndKeys:controlPosAnim, @"frameOrigin", nil]]; 
[[controlView animator] setFrame:newFrame]; 
+0

प्रतिक्रिया के लिए धन्यवाद। मुझे कोड के थोड़ा पुनर्गठन के साथ यह काम मिल गया। मुझे लगता है कि डब्ल्यूडब्ल्यूडीसी के दौरान ऐप्पल के उदाहरणों ने आपको एनीमेशन सेट करने से पहले दृश्य * में हेरफेर करने के लिए कहा था। तो आप एनिमेटर के साथ प्रतिनिधियों का उपयोग कैसे कर सकते हैं? मैंने इसके उदाहरणों के लिए दूर और व्यापक खोज की है और खाली आ गई है। मैंने कई पदों को भी देखा कि यह संभव नहीं था। – btschumy

+0

प्रतिनिधि को अपने नियंत्रण में सेट करें PosAnim, इसे नियंत्रण दृश्य के एनिमेशन में जोड़ें, प्रतिनिधि विधियों को बुलाया जाएगा। –

+0

जानकारी के लिए धन्यवाद – btschumy

8

वर्तमान रन लूप के अंत में दृश्यों में किए गए परिवर्तन प्रभावी होते हैं। परतों पर लागू किसी भी एनिमेशन के लिए यह वही है।

यदि आप दृश्य की परत को एनिमेट करते हैं, तो दृश्य स्वयं अप्रभावित होता है, यही कारण है कि एनीमेशन पूर्ण होने पर दृश्य अपनी मूल स्थिति पर वापस कूदने लगता है।

इन दो चीजों को ध्यान में रखते हुए, आप दृश्य के फ्रेम को सेट करके उस प्रभाव को प्राप्त कर सकते हैं जिसे आप एनीमेशन के दौरान किया जाना चाहते हैं और फिर दृश्य की परत में एक स्पष्ट एनीमेशन जोड़ना चाहते हैं।

जब एनीमेशन शुरू होता है, तो यह दृश्य को प्रारंभिक स्थिति में ले जाता है, इसे अंत स्थिति में एनिमेट करता है और जब एनीमेशन किया जाता है, तो दृश्य में आपके द्वारा निर्दिष्ट फ्रेम होता है।

- (IBAction)animateTheView:(id)sender 
{ 
    // Calculate start and end points. 
    NSPoint startPoint = theView.frame.origin; 
    NSPoint endPoint = <Some other point>;  

    // We can set the frame here because the changes we make aren't actually 
    // visible until this pass through the run loop is done. 
    // Furthermore, this change to the view's frame won't be visible until 
    // after the animation below is finished. 
    NSRect frame = theView.frame; 
    frame.origin = endPoint; 
    theView.frame = frame; 

    // Add explicit animation from start point to end point. 
    // Again, the animation doesn't start immediately. It starts when this 
    // pass through the run loop is done. 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [animation setFromValue:[NSValue valueWithPoint:startPoint]]; 
    [animation setToValue:[NSValue valueWithPoint:endPoint]]; 
    // Set any other properties you want, such as the delegate. 
    [theView.layer addAnimation:animation forKey:@"position"]; 
} 

बेशक, इस कोड के लिए आपको यह सुनिश्चित करने की ज़रूरत है कि आपके व्यू और उसके पर्यवेक्षण दोनों में परतें हों। यदि पर्यवेक्षण में कोई परत नहीं है, तो आपको दूषित ग्राफिक्स मिलेंगे।

+0

वाह सुपर और बच्चे दोनों की परतों की आखिरी टिप्पणी के लिए धन्यवाद या आप भ्रष्ट ग्राफिक्स प्राप्त करेंगे। इससे मुझे पूरी तरह से असंबंधित मुद्दे को ठीक करने में मदद मिली। धन्यवाद! – migs647

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

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