我在NSStatusItem對象中有一個自定義視圖。 此視圖顯示圖標。它也能夠顯示進度,但您必須致電[self.statusitemview setProgressValue:theValue];
我有一組圖標,並使用此值選擇正確的圖標。動畫NSStatusItem
這似乎是非常生澀,因爲執行的進程不會始終發送更新。 所以我想動畫這個。
我想要像其他可可控件一樣調用動畫: [[self.statusItemView animator] setProgressValue:value];
如果這是在所有可能的
什麼是做到這一點的正確方法? 我不想使用NSTimer。
編輯
圖像是使用drawRect中得出:方法
下面的代碼:
- (void)drawRect:(NSRect)dirtyRect
{
if (self.isHighlighted) {
[self.statusItem drawStatusBarBackgroundInRect:self.bounds withHighlight:YES];
}
[self drawIcon];
}
- (void)drawIcon {
if (!self.showsProgress) {
[self drawIconWithName:@"statusItem"];
} else {
[self drawProgressIcon];
}
}
- (void)drawProgressIcon {
NSString *pushed = (self.isHighlighted)[email protected]"-pushed":@"";
int iconValue = ((self.progressValue/(float)kStatusItemViewMaxValue) * kStatusItemViewProgressStates);
[self drawIconWithName:[NSString stringWithFormat:@"statusItem%@-%d", pushed, iconValue]];
}
- (void)drawIconWithName:(NSString *)iconName {
if (self.isHighlighted && !self.showsProgress) iconName = [iconName stringByAppendingString:@"-pushed"];
NSImage *icon = [NSImage imageNamed:iconName];
NSRect drawingRect = NSCenterRect(self.bounds, icon);
[icon drawInRect:drawingRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
}
- (void)setProgressValue:(int)progressValue {
if (progressValue > kStatusItemViewMaxValue || progressValue < 0) {
@throw [NSException exceptionWithName:@"Invalid Progress Value"
reason:[NSString stringWithFormat:@"The value %d id invalid. Range {0 - %d}", progressValue, kStatusItemViewMaxValue]
userInfo:nil];
}
_progressValue = progressValue;
[self setNeedsDisplay:YES];
}
- (void)setShowsProgress:(BOOL)showsProgress {
if (!showsProgress) self.progressValue = 0;
_showsProgress = showsProgress;
[self setNeedsDisplay:YES];
}
它有可能以某種方式。 由於來自蘋果標準控制使用的drawRect繪製:,但有流暢的動畫......
您的狀態項目視圖是如何定義的?它有一層嗎?什麼setProgressValue:做什麼? –
不幸的是,我使用drawRect實現它: – NSAddict
和setProgressValue只是設置了一個ivar併發送了setNeedsDisplay:來更新它 – NSAddict