2012-10-23 12 views
5

मेरे पास एक सामान्य एनएसवी व्यू है जो विंडो किनारों को खींचकर आकार बदल सकता है।एनएसवी व्यू मिड-एनीमेशन का आकार बदलना

यदि दृश्य [NSView एनिमेटर] एनीमेशन के दौरान आकार बदलता है, तो यह मूल एनीमेशन के अंतिम आकार को एनिमेट करना जारी रखता है, लेकिन यह नई विंडो आकार को ध्यान में रखता नहीं है।

Here is a simple example project. एनीमेशन शुरू करने के लिए डबल क्लिक करें, फिर इसे समाप्त होने से पहले विंडो का आकार बदलें।

एनीमेशन को नए फ्रेम आकार का विवरण लेने का सबसे अच्छा तरीका क्या है?

उत्तर

0

आईएमएचओ, आकार बदलने के चरण के साथ ही एनीमेशन को रोकने का सबसे अच्छा तरीका होगा। आकार बदलने के चरण के दौरान, उपयोगकर्ता नियंत्रण में है और विंडो के आकार को मैन्युअल रूप से सेट करता है। जब आकार बदलने का चरण समाप्त होता है, तो विंडो पहले से वांछित आकार पर सेट हो जाती है, इसलिए अधिक करने की आवश्यकता नहीं है। एक समारोह के बार-बार

चलो टाइमर कॉल, जब तक एनीमेशन "पूर्ण" है:

0

समस्या इस प्रकार का सबसे अच्छा एक NSTimer बजाय एनिमेटर समारोह के साथ हल किया गया है। एक बार पूरा होने पर, टाइमर समाप्त करें (अमान्य)।

समारोह प्रत्येक पाश में बार-बार कहे जाने के खिड़की और अपने दृश्य की वास्तविक framesize की वास्तविक framesize पकड़ लेता है और बस को देखने के फ्रेम करने के लिए दो के अंतर के तीसरे कहते हैं, जैसे:

frame.size.height += diffHeight/3.0; 

तो, कोई फर्क नहीं पड़ता कि क्या होता है, दृश्य अपने गंतव्य के करीब और करीब बढ़ता या घटता है। एक बार पेट (अंतर का) कम है तो उदा। 0.2 आप दृश्य को सीधे वांछित आकार में सेट करते हैं और टाइमर को समाप्त करते हैं। यह प्रत्यक्ष है, केवल छोटे कोड का उपयोग करता है और आपको किसी भी घटना को सुनने की आवश्यकता नहीं होती है, जबकि यह बहुत अच्छी तरह से प्रदर्शन करती है। :-)

यहाँ एनीमेशन initiallize के लिए महत्वपूर्ण कोड हैं (घड़ी अपनी कक्षा का एक उदाहरण होना चाहिए):

if(timer)return; 
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(resizeView:) userInfo:[NSNumber numberWithBool:status] repeats:YES]; 
[timer setTolerance:0.02]; 

मैं शब्द स्थिति के बजाय अपने शब्द को बंद कर दिया उपयोग करते हैं, समारोह को बार-बार होने के लिए जिसे शायद कुछ हद तक देखा जा सकता है:

- (void)resizeView:(id)userInfo; 
{ 
    BOOL status = [(NSNumber *)[userInfo userInfo] boolValue]; 
    double startwid,stopwid; 
    NSRect newSizeRect = [[self window] frame]; 
    stopwid = newSizeRect.size.width; 
    if(status){ 
     stopwid -= 100.0; 
    } 
    NSRect cbgRect = [self frame]; 
    startwid = cbgRect.size.width; 
    double diff = stopwid-startwid; 
    if(fabs(diff)<0.2){ 
     diff = 0; 
     startwid = stopwid; 
     [timer invalidate]; 
     timer = nil; 
     //NSLog(@"stop"); 
    } 
    //NSLog(@"%f - %f = %f /10 = %f",stopwid,startwid,diff,diff/3.0); 
    cbgRect.size.width = startwid+diff/3.0; 

    [self setFrame:cbgRect]; 
} 
संबंधित मुद्दे