ken*_*der 17 macos cocoa statusbar
我想在Mac OS状态栏中放置一个图标作为我的cocoa应用程序的一部分.我现在做的是:
NSStatusBar *bar = [NSStatusBar systemStatusBar];
sbItem = [bar statusItemWithLength:NSVariableStatusItemLength];
[sbItem retain];
[sbItem setImage:[NSImage imageNamed:@"Taski_bar_icon.png"]];
[sbItem setHighlightMode:YES];
[sbItem setAction:@selector(stopStart)];
Run Code Online (Sandbox Code Playgroud)
但如果我想要图标动画(3-4帧),我该怎么办?
Rob*_*ger 27
你需要反复调用-setImage:你的NSStatusItem,在不同的图像每次路过.最简单的方法是使用一个NSTimer和一个实例变量来存储动画的当前帧.
像这样的东西:
/*
assume these instance variables are defined:
NSInteger currentFrame;
NSTimer* animTimer;
*/
- (void)startAnimating
{
currentFrame = 0;
animTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateImage:) userInfo:nil repeats:YES];
}
- (void)stopAnimating
{
[animTimer invalidate];
}
- (void)updateImage:(NSTimer*)timer
{
//get the image for the current frame
NSImage* image = [NSImage imageNamed:[NSString stringWithFormat:@"image%d",currentFrame]];
[statusBarItem setImage:image];
currentFrame++;
if (currentFrame % 4 == 0) {
currentFrame = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我重新编写了Rob的解决方案,以便我可以重用它:
我有帧数9,所有图像名称都有最后一位数作为帧号,这样我每次都可以重置图像来为图标设置动画.
//IntervalAnimator.h
#import <Foundation/Foundation.h>
@protocol IntervalAnimatorDelegate <NSObject>
- (void)onUpdate;
@end
@interface IntervalAnimator : NSObject
{
NSInteger numberOfFrames;
NSInteger currentFrame;
__unsafe_unretained id <IntervalAnimatorDelegate> delegate;
}
@property(assign) id <IntervalAnimatorDelegate> delegate;
@property (nonatomic) NSInteger numberOfFrames;
@property (nonatomic) NSInteger currentFrame;
- (void)startAnimating;
- (void)stopAnimating;
@end
#import "IntervalAnimator.h"
@interface IntervalAnimator()
{
NSTimer* animTimer;
}
@end
@implementation IntervalAnimator
@synthesize numberOfFrames;
@synthesize delegate;
@synthesize currentFrame;
- (void)startAnimating
{
currentFrame = -1;
animTimer = [NSTimer scheduledTimerWithTimeInterval:0.50 target:delegate selector:@selector(onUpdate) userInfo:nil repeats:YES];
}
- (void)stopAnimating
{
[animTimer invalidate];
}
@end
Run Code Online (Sandbox Code Playgroud)
如何使用:
符合StatusMenu类中的协议
//create IntervalAnimator object
animator = [[IntervalAnimator alloc] init];
[animator setDelegate:self];
[animator setNumberOfFrames:9];
[animator startAnimating];
Run Code Online (Sandbox Code Playgroud)实施协议方法
-(void)onUpdate {
[animator setCurrentFrame:([animator currentFrame] + 1)%[animator numberOfFrames]];
NSImage* image = [NSImage imageNamed:[NSString stringWithFormat:@"icon%ld", (long)[animator currentFrame]]];
[statusItem setImage:image];
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
7261 次 |
| 最近记录: |