Đây là loại vấn đề được giải quyết tốt nhất với một NSTimer thay vì chức năng làm phim hoạt hình:
Hãy gọi hẹn giờ một hàm liên tục, cho đến khi hình ảnh động là "hoàn thành". Sau khi hoàn tất, hãy kết thúc bộ hẹn giờ (không hợp lệ).
Các hàm được gọi nhiều lần trong mỗi vòng lặp grabs framesize thực tế của các cửa sổ và các framesize thực tế của quan điểm của bạn và chỉ cần thêm con thứ ba trong sự khác biệt của hai vào khung về quan điểm, như:
frame.size.height += diffHeight/3.0;
Vì vậy, bất kể điều gì xảy ra, chế độ xem sẽ tăng hoặc co lại gần hơn và gần hơn với điểm đến của nó. Một khi abs (của sự khác biệt) ít hơn thì ví dụ: 0.2 bạn đặt chế độ xem trực tiếp về kích thước mong muốn và kết thúc bộ hẹn giờ. Đây là trực tiếp, chỉ sử dụng ít mã và bạn không cần phải nghe bất kỳ sự kiện nào trong khi nó hoạt động khá tốt. :-)
Dưới đây là các mã quan trọng đối với initiallize các hình ảnh động (timer phải là một thể hiện của lớp học của bạn):
if(timer)return;
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(resizeView:) userInfo:[NSNumber numberWithBool:status] repeats:YES];
[timer setTolerance:0.02];
tôi sử dụng tình trạng từ thay vì từ nhắm lại, chức năng được lặp đi lặp lại gọi là sau đó có thể trông hơi giống như:
- (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];
}