2008-11-04 22 views
5

Tôi cần phải đưa hình ảnh từ NSProgressIndicator vào Ô NSOutlineView. Tôi đã viết mã để thực hiện điều này cho một chỉ báo xác định và nó hoạt động rất tốt:Nhận NSImage từ NSProgressIndicator

NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)]; 
[progressIndicator setStyle:NSProgressIndicatorSpinningStyle];   
[progressIndicator setIndeterminate:NO]; 
[progressIndicator setMaxValue:100.0]; 
[progressIndicator setDoubleValue:somePercentage];   

NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]]; 
[progressIndicator release]; 


return [updateImage autorelease]; 

Tôi đã cố gắng sửa đổi mã cũng cho tôi hình ảnh chỉ báo không xác định. Tuy nhiên đối với trường hợp không xác định, tôi luôn nhận được hình ảnh 16x16 trống. (Tôi đã xác nhận điều này bằng cách viết hình ảnh vào một tệp trong mỗi trường hợp, trường hợp xác định mang lại cho tôi hình ảnh chỉ báo tiến trình, trường hợp không xác định luôn là hình vuông màu trắng 16x16).

Mã sửa đổi là:

if(self.lengthUnknown) 
{ 
    NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)]; 
    [progressIndicator setStyle:NSProgressIndicatorSpinningStyle];   
    [progressIndicator setIndeterminate:YES]; 

    NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]]; 
    [progressIndicator release]; 


    return [updateImage autorelease]; 
} 
else 
{ 
// Same code as the first listing, this case works fine 
} 

Do chỉ số tiến bộ không xác định sử dụng một số loại bản vẽ gây -dataWithPDFInsideRect: là không có khả năng chụp ảnh của họ?


Thông tin thêm: tôi đã cố gắng thiết lập các chỉ số tiến bộ không sử dụng hình ảnh động ren cũng như cố gắng để lấy các nội dung thông qua phương pháp lockFocus NSImage như gợi ý dưới đây nhưng không ai trong số những nỗ lực tạo ra một sự khác biệt.

Mã chỉ báo tiến trình mà Dave đề cập bên dưới (AMIndeterminateProgressIndicatorCell) là giải pháp tuyệt vời, nhưng tôi vẫn muốn biết tại sao tôi không thể sử dụng cùng một kỹ thuật hoạt động với chế độ xác định.

Trả lời

2

chỉ Progress làm sử dụng một sợi nền để giữ cho hình ảnh động của họ vẽ ngay cả khi chủ đề chính là bận rộn làm cái gì khác, vì vậy nó có thể đó là những gì đang gây ra vấn đề. Bạn có thể thử gọi setUsesThreadedAnimation: NO trên chỉ báo tiến trình trước khi thực hiện bản vẽ của bạn để xem điều đó có tạo sự khác biệt hay không.

Một nguyên tắc khác là tạo NSImage trống và sau đó gọi phương thức drawRect của chỉ báo tiến trình: phương thức để hiển thị nội dung của nó vào bộ đệm hình ảnh. Điều đó sẽ trông giống như sau:

 
NSProgressIndicator* progressIndicator; 
NSImage* image = [[NSImage alloc] initWithSize:[progressIndicator bounds].size]; 
[image lockFocus]; 
[progressIndicator drawRect:[progressIndicator bounds]]; 
[image unlockFocus]; 
Các vấn đề liên quan