我想將動畫進度條放在NSMenuItem
自定義視圖中。這在Apple的MenuItemView示例中得到了演示,但它不帶動畫(至少不在10.5中,示例顯然是從10.4開始的)。NSMenuItem中的動畫進度條
我試着設置一個計時器,調用setNeedsDisplay:YES
,計劃爲NSEventTrackingRunLoopMode
像文檔說的。這是有效的,但只適用於確定的進度條,如果我更改了值,並且僅在菜單第一次打開時纔有效。第二次和連續的時間,酒吧重繪兩次,然後凍結。對於一個不確定的進度條,理髮杆條紋從不動畫。
編輯:代碼片段。我剛剛添加了
itemChanged
呼叫,這似乎沒有任何影響。更新純文字項目正常工作。
class AppDelegate(NSObject):
barItem = None
menuProgressBar = None
progressItem = None
def applicationDidFinishLaunching_(self, sender):
statusbar = NSStatusBar.systemStatusBar()
self.statusitem = statusbar.statusItemWithLength_(
NSSquareStatusItemLength)
self.statusitem.setHighlightMode_(True)
image = NSImage.imageNamed_("menubar.png")
self.statusitem.setImage_(image)
self.statusitem.retain()
menu = NSMenu.alloc().init()
AppDelegate.barItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('progress', None, '')
itemView = NSView.alloc().initWithFrame_(NSMakeRect(0, 0, 50, 20))
itemView.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar = \
NSProgressIndicator.alloc().initWithFrame_(NSMakeRect(16, 5, 22, 10))
AppDelegate.menuProgressBar.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar.setControlSize_(NSSmallControlSize)
AppDelegate.menuProgressBar.setUsesThreadedAnimation_(True)
itemView.addSubview_(AppDelegate.menuProgressBar)
AppDelegate.menuProgressBar.setIndeterminate_(False)
AppDelegate.menuProgressBar.setMaxValue_(100)
AppDelegate.menuProgressBar.startAnimation_(self)
timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(
0.1, self,
objc.selector(self.animateProgress, signature='[email protected]:'),
None, True)
NSRunLoop.currentRunLoop().addTimer_forMode_(
timer, NSEventTrackingRunLoopMode)
AppDelegate.barItem.setView_(itemView)
menu.addItem_(AppDelegate.barItem)
AppDelegate.progressItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('Progress', None, '')
menu.addItem_(AppDelegate.progressItem)
self.statusitem.setMenu_(menu)
def animateProgress(self):
time = NSDate.timeIntervalSinceReferenceDate()
AppDelegate.menuProgressBar.setDoubleValue_(time%100)
AppDelegate.menuProgressBar.display()
AppDelegate.progressItem.setTitle_('Progress: %d'%(time%100))
AppDelegate.barItem.menu().itemChanged_(AppDelegate.barItem)
是的,我也做了這些。沒有效果。 – Uncommon 2010-11-03 19:21:31
可能會發布您的代碼的時間。 – 2010-11-03 19:25:00
已發佈代碼示例。 – Uncommon 2010-11-04 20:32:06