2012-10-23 46 views
5

Tôi có NSView bình thường có thể thay đổi kích thước bằng cách kéo các cạnh của cửa sổ.Thay đổi kích cỡ hình ảnh động giữa NSView

Nếu chế độ xem được thay đổi kích thước trong hoạt ảnh [NSView animator], chế độ xem sẽ tiếp tục hoạt ảnh với kích thước cuối cùng của hoạt ảnh gốc nhưng không tính đến kích thước cửa sổ mới.

Here is a simple example project. Nhấp đúp để bắt đầu hoạt ảnh, sau đó thay đổi kích thước cửa sổ trước khi nó kết thúc.

Cách tốt nhất để làm cho hoạt ảnh có tính đến kích thước khung hình mới là gì?

Trả lời

0

IMHO, cách tốt nhất là dừng hoạt ảnh ngay khi giai đoạn thay đổi kích thước bắt đầu. Trong giai đoạn thay đổi kích cỡ, người dùng nằm trong tầm kiểm soát và đặt kích thước cửa sổ theo cách thủ công. Khi giai đoạn thay đổi kích thước kết thúc, cửa sổ đã được đặt thành kích thước mong muốn, vì vậy không cần phải làm nhiều hơn nữa.

0

Đâ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]; 
} 
Các vấn đề liên quan