समस्या इस प्रकार का सबसे अच्छा एक 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];
}