Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

在Cocoa程序中进行屏幕截图

用过QQ for Mac的都知道QQ能够直接截图发送。那么,我们如何在Cocoa程序中嵌入截图支持呢?有一个最简单的方法是使用OSX自带的screencapture命令行工具来进行截图。

下面用代码来进行说明:

在NSWindow窗口标题栏上绘制辅助视图

如果你用过Acorn的试用版,你一定知道Acorn的试用版的文档窗口的标题栏上有一个提示过期的按钮。虽然标题栏不能被滥用来绘制控件,但是有时候,恰到好处的使用会改善用户体验。比如说,Lion的全屏按钮就是放在标题栏上的;Chocolat文本编辑器也放了一个新建标签的按钮在标题栏上,Lion全屏按钮的旁边。

浅谈iOS 5的StoryBoard

StoryBoard是iOS 5的新特征,旨在代替历史悠久的NIB/XIB(其实StoryBoard还是基于NIB/XIB的,不过开发人员已经无需直接跟NIB打交道了)。目前关于StoryBoard的文档并不多,苹果的iOS 5的开发者文档里也仅有不多的介绍。所以,本文只是简单的谈谈本人对StoryBoard的一些粗浅的理解。(StoryBoard有时也叫做StoryBoarding,我不太注意这种细节,所以两个词经常会混用,如果你英语可以的话,能体会到两者的细微差别)

用Mobile Safari打开UIWebView里的链接

UIWebView本身就是一个功能非常完整的浏览器。UIWebView经常被用来向用户展示打包在应用程序中的HTML帮助文档。有时,很多时候,帮助文档需要提供一些外链的链接。如果直接在UIWebView中打开这些链接,不仅会使显示帮助文档的ViewController变得臃肿,而且也没有Mobile Safari那么好的阅读体验。因此,大多数时候,在Mobile Safari中打开外链的链接是一个比较好的解决方法。

方法很简单,如下:

1
2
3
4
5
6
7
8
- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if (inType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
    }

    return YES;
}

这里用到的是UIWebViewDelegate-webView:shouldStartLoadWithRequest:navigationType:方法。在示例代码中,我只是简单的在用户点击链接的时候调用Mobile Safari打开链接。在实际应用中,完全可以加入一些判断条件来针对不同的URL选择是否直接在UIWebView里打开或在Mobile Safari里打开。

(全文完)

用Quartz绘制NSImage圆角图像

今天偶尔看到了用Quartz绘制UIImage圆角图像的源码的Snippet,因此心血来潮,简单的改了几行,把它移植到NSImage上了。也正是因为研究这个问题,我才发现了NSImage不能准确获得图片的实际像素大小的问题。说实话,那个代码片断我也是一知半解,因此我只是依样画葫芦,也直接把源码附上,也不知道有没有更好的方法,仅供参考。

获取NSImage图片的准确大小

今天在测试代码的时候发现了一个诡异的问题,那就是NSImage加载图片的时候无法准确获得图片的大小。

最初的代码是这样的:

1
2
3
4
NSImage *image = [NSImage imageNamed:@"image"];
NSLog(@"%f, %f", image.size.width, image.size.height);
//终端Log到的图片的尺寸是:185.250000, 106.500000,而实际的大小是274.0, 142.0。
//image.size = NSMakeSize(247.0, 142.0); //强制指定尺寸能够解决问题

我用一个Image Well来显示图片的时候,发现图片居然比实际的要小!我试着NSLog图片的大小,发现NSImage加载的图片的size根本就是错的!我根据图片的实际大小,强制设置了图片的尺寸,图片就显示正常了,而且也没有被拉伸的痕迹。这说明图片数据在加载后并没有损耗,只是图片的size属性出错了,因此,强制设置size属性,图片就能正常显示了。