MacOSX程序开发笔记(一)

状态栏添加图标

在系统的菜单栏上添加App的图标

常驻应用必争之地


状态栏是MacOSX常驻应用的必争之地,代码如下

NSStatusItem *_statusItem = [[NSStatusBar systemStatusBar] statusItem WithLength:NSVariableStatusItemLength];

[_statusItem setImage:[NSImage imageNamed:@"image"]];

[_statusItem setToolTip:@"额"];

[_statusItemset HighlightMode:YES];

// 设置点击方法

_statusItem.button.action = @selector(selectBtn:);

这里需要注意的是,NSStatusItem最好写到全局属性,不然可能出现神奇的事情

UIButton 设置按钮背景图片

// set up start button

UIImage *greenImage = [[UIImage imageNamed:@"green_button.png"] stretchableImageWithLeftCapWidth:12.0 topCapHeight:0.0];

UIImage *redImage = [[UIImage imageNamed:@"red_button.png"] stretchableImageWithLeftCapWidth:12.0 topCapHeight:0.0];

[startButton setBackgroundImage:greenImage forState:UIControlStateNormal];

[startButton setBackgroundImage:redImage forState:UIControlStateDisabled];

[startButton setEnabled:YES];

NSView中实现鼠标的相关响应(转)

在cocoa中的鼠标事件相比ios中的touch事件要显得复杂一些,ios中可以通过重写touchBegin、touchMove、touchEnd等相应方法便可,或是控制相应的响应链。但在cocoa中却引入了一个TrackingArea(跟踪区域)的概念,你需要继承相应的NSResponder对象(如NSView),在合适的地方添加trackingArea,然后便可以通过重写相应的mouse方法就可以了。

下面举例两种方式实现对整个视图的跟踪:

方法一

-  (id)initWithFrame:(NSRect)frameRect {

self = [super initWithFrame:frameRect];

if (self) {

[self addTrackingRect:self.bounds owner:self userData:nil assumeInside:YES];

}

return self;

}

方法二

优点在于可以实现当视图未激活情况下也能响应)

//此方法需要在改变的时候手动调用一次(父类的方法)

- (void)updateTrackingAreas

{

NSArray *trackings = [self trackingAreas];

for (NSTrackingArea *tracking in trackings)

{

[self removeTrackingArea:tracking];

}

//添加NSTrackingActiveAlways掩码可以使视图未处于激活或第一响应者时也能响应相应的方法

NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved|NSTrackingActiveAlways owner:self userInfo:nil];

[self addTrackingArea:trackingArea];

}

设置WebView随着window窗口增大缩小

[iWebView setUIDelegate:self];

[iWebView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

没有标题栏的NSWindow如何拖动

[[self window] setMovableByWindowBackground:YES];

Mac应用点击关闭按钮就退出程序的方法

方法一:

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender{

return YES;

}

方法二:

NSButton *closeButton = [self window] standardWindowButton:NSWindowCloseButton];

[closeButton setTarget:self];

[closeButton setAction:@selector(closeApplication)];

- (void) closeApplication {

[NSApplication sharedApplication] terminate:nil];

}

NSButton生成自定义Button

NSButton *btnMax =[[NSButton alloc]initWithFrame:CGRectMake(14, 0, 14, 14)];

[btnMax setImage:[NSImage imageNamed:@"max"]];

[btnMax setAlternateImage:[NSImage imageNamed:@"maxDown"]];

[[btnMax cell]setHighlightsBy:NSContentsCellMask];

[btnMax setBordered:NO];

[viewGo addSubview:btnMax];

NSString判断字符是否一样

- (BOOL)hasPrefix:(NSString *)string; 判断前面是否包含子串

- (BOOL)hasSuffix:(NSString *)string; 判断末尾是否包含子串

- (NSRange)rangeOfString:(NSString *)string;第一次出现b包含字符串

NSString  [a hasPrefix: ]  [a hasSuffix:]  判断开头和结束是否包含子串

- (void)viewDidLoad

{

NSMutableString  *a = [[NSMutableString alloc ] initWithString :@"i like long dress"];

NSLog(@"\n a: %@",a);

[a hasPrefix:@"i"] ==YES? NSLog(@"以 i 开头"): NSLog(@"不以 i 开头");

[a hasSuffix:@"hat"] ==YES? NSLog(@"以 hat 结尾"): NSLog(@"不以 hat 结尾");

[a release];

}

文件夹中

NSString *resourcesPath = [[NSBundlemainBundle] resourcePath];

NSString *htmlPath = [resourcesPath stringByAppendingFormat:@"/htdocs/about.html"];

[[webViewmmainFrame] loadRequest:[NSURLRequestrequestWithURL:[NSURLfileURLWithPath:htmlPath]]];

在Documents文件夹里

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"index.html"];

NSURL *url = [NSURL fileURLWithPath:path];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

[_webView loadRequest:request];

webView中打开链接地址

// 方法一:

[webViewm setMainFrameURL:@"http://www.pc175.com"];

// 方法二:

NSString *urlString =@"http://www.baidu.com";

[[webView mainFrame] loadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:urlString]]];

屏蔽WebView右键菜单方法

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

{

[_webViews setUIDelegate: self];

}

- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems{

return nil;

}

NSTableView row 响应双击事件和单击事件 setDoubleAction 和 setAction

-(void)awakeFromNib{

[super awakeFromNib];

[tableView setTarget:self];

[tableView setDoubleAction:NSSelectorFromString(@"doubleClick:")];

//setDoubleAction双击选择事件

[tableView setAction:NSSelectorFromString(@"doubleClick:")];//setAction单击选择事件

}

- (void) doubleClick: (id)sender

{

NSInteger rowNumber = [tableViewclickedRow];

NSLog(@"Double Clicked.%ld ",rowNumber);

}

显示窗口orderFront、隐藏窗口orderOut

- (IBAction)hideWindow:(id)sender{

[theWindow orderOut:sender];

}

- (IBAction)hideWindow:(id)sender{

if ([theWindow isVisible])

[theWindow orderOut:sender];

}

- (IBAction)showWindow:(id)sender{

[theWindow orderFront:sender];

}

NStableView Transparent NStableView透明设置

[[tableView enclosingScrollView] setDrawsBackground:NO];

[tableView setBackgroundColor:[NSColor clearColor]];

NSString与int和float的相互转换

字符串拼接

NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB];

字符转int

int intString = [newString intValue];

int转字符

NSString *stringInt = [NSString stringWithFormat:@"%d",intString];

字符转float

float floatString = [newString floatValue];

float转字符

NSString *stringFloat = [NSString stringWithFormat:@"%f",intString];

获取tag

NSString *tags = [NSStringstringWithFormat:@"%i",[sender tag]];

NSLog(@"%@",tags);

全屏窗口中响应鼠标事件

如果想要全屏窗口中响应鼠标事件,必须重写一下- (BOOL)canBecomeKeyWindow,使其总是返回YES

- (BOOL)canBecomeKeyWindow{

return YES;

}

判断双击

[theEvent clickCount] == 2

if([theEvent clickCount] == 1){

NSLog(@"111");

}else if([theEvent clickCount] == 2){

NSLog(@"222");

}

获取当前时间

NSDate *nows =[NSDatedate];

NSCalendar *gregorian = [[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit  | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:nows];

NSInteger hour = [dateComponents hour];

NSInteger minute = [dateComponents minute];

NSInteger second = [dateComponents second];

NSInteger month=[dateComponents month];

NSInteger day=[dateComponents day];

NSLog(@"%@",[NSStringstringWithFormat: @"status%lu",day]);

NSLog Format specifiers for data types数据类型格式规范

Type

Format specifier

Considerations

NSInteger

%ld or %lx

Cast the value to long

NSUInteger

%lu or %lx

Cast the value to unsigned long

CGFloat

%f or %g

%f works for floats and doubles when formatting; but see below warning when scanning

CFIndex

%ld or %lx

The same as NSInteger

pointer

%p

%p adds 0x to the beginning of the output. If you don't want that, use %lx and cast to long.

long long

%lld or %llx

long long is 64-bit on both 32- and 64-bit platforms

unsigned long long

%llu or %llx

unsigned long long is 64-bit on both 32- and 64-bit platforms

隐藏window titlebar

[_windowsetStyleMask:NSBorderlessWindowMask];

解决超链接添加 target=”_blank”之后在WebView中不能打开

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{

[webViewsetUIDelegate:self];

}

- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{

NSLog(@"sss%@",sender);

NSUInteger windowStyleMask =    NSClosableWindowMask |

NSMiniaturizableWindowMask |

NSResizableWindowMask |

NSTitledWindowMask;

NSWindow * webWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 800, 600) styleMask:windowStyleMask backing:NSBackingStoreBuffereddefer:NO];

WebView * newWebView = [[WebView alloc] initWithFrame:[webWindow contentRectForFrameRect:webWindow.frame]];

[newWebView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

[webWindow setContentView:newWebView];

[webWindow center];

[webWindow makeKeyAndOrderFront:self];

[[newWebView mainFrame] loadRequest:request];

return newWebView;

}

隐藏和显示最小化时的图标徽章

OSX的窗口在最小化的时候,在缩略图的右下角会显示一个程序图标徽章。我们可以通过程序来显示和隐藏最小化图标的徽章。方法很简单如下:

// Show minimize icon badge

- (IBAction)showMinimizeBadge:(id)sender {

[[self.windowdockTile] setShowsApplicationBadge:YES];

}

// Remove minimize icon badge

- (IBAction)removeMinimizeBadge:(id)sender {

[[self.windowdockTile] setShowsApplicationBadge:NO];

}

status bar

NSDictionary*titleAttributes =[NSDictionary dictionaryWithObject:[NSColor blueColor] forKey:NSForegroundColorAttributeName];

NSAttributedString* blueTitle =[[NSAttributedString alloc] initWithString:@"myTitle" attributes:titleAttributes];

statusItem =[[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];

[statusItem setAttributedTitle:blueTitle];

[blueTitle release];

退出应用程序事件

-(IBAction)quitAction:(id)sender {

[NSApp terminate:sender];

}

给Dock图标加Badge

// Add badge

- (IBAction)addBadge:(id)sender {

[[NSAppdockTile] setBadgeLabel:[NSStringstringWithFormat:@"%d", random() % 11]];

}

// Remove badge

- (IBAction)removeBadge:(id)sender  {

[[NSAppdockTile] setBadgeLabel:nil];

}

加Badge是用NSDockTile类的-setBadgeLabel:方法;移除Badge是把badgeLabel的内容设置为nil。这个方法在10.5以上都可以使用,除非需要兼容10.4以下的OSX--现在似乎已经没有很大的必要了,或者是有其他特别的理由,否则真的很难拒绝使用Cocoa的这个简单的API调用。 :)

更换Dock图标

有很多程序能够动态的修改程序图标,如,Adium和iCal。我们通过代码,我们可以在程序运行的时候动态设置Dock图标。修改图标有两种方法,一种是直接指定一个NSImage对象设置应用程序的图标;另一种是用一个自定义的View,来显示为Dock图标。

// Customize Dock Icon

- (IBAction)changeDockIcon:(id)sender {

[NSAppsetApplicationIconImage:[NSImageimageNamed:@"Icon"]];

}

// Restore Dock Icon

- (IBAction)restoreDockIcon:(id)sender {

[NSAppsetApplicationIconImage:nil];

}

// Draw Dock Icon with Custom View

- (IBAction)changeDockIconWithCustomView:(id)sender {

DockIconView *dockView = [[[DockIconView alloc] init] autorelease];

[[NSApp dockTile] setContentView: dockView];

[[NSAppdockTile] display];

}

用自定义View做图标不能自动刷新,所以如果Dock图标有所改变--如加Badge时,可能需要手动通过-display方法刷新。

上面介绍的两种方法修改的程序图标会在程序退出之后还原为在Info.plist里指定的应用程序图标。要永久的改变程序图标(也就是退出程序的时候也能显示修改后的图标)的方法是创建Dock图标的插件。因为这个话题涉及Bundle相关的内容,在这里就不详述了,详情可以参考苹果的文档,以后有机会我会专门写文章介绍Dock图标插件的话题。

隐藏状态栏

In Xcode, double-click the Info.plist file in the left window.

Add a key named UIStatusBarHidden to Info.plist.

Right-click the value field and set the type to Boolean, and then check True.

NSArray 切分数组

NSString *string=@"oop:ack:bork:greeble:ponies";

NSArray *chunks=[string componentsSeparatedByString:string];

string=[chunks componentsJoinedByString:@":-)"];

//上面得代码行将会创建一个内容为oop:-)ack:-)bork:-)greeble:-)ponies 得NSString字符串

actionSheet xcode

UIActionSheet *actionSheet=[[UIActionSheetalloc] initWithTitle:@"Are you sure"delegate:selfcancelButtonTitle:@"now way"destructiveButtonTitle:@"yes,I'm sure!"otherButtonTitles:nil, nil];

[actionSheet showInView:self.view];

[actionSheet release];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容