Nov 11, 2015 - The new features of OSX 10.11 and Xcode 7

The new features of OSX 10.11 and Xcode 7

New features

        • Split View

        用户只要按下F3就会看到全新的任务管理界面,用户只需要将两个应用拖进同一个桌面即可以实现Split View功能。 Split View功能的意义并不是同时查看两个应用,而是在于将两个应用摆在一起去提高工作效率,理想使用场景是一边通过网页查资料,一边写文档。同时,用户可以自行调整两个应用分屏的比例,系统会自动记忆下来。 同时,用户只需轻扫一下,就能回到桌面,轻松切换到之前进行的其它事情上,大大提高了使用效率。

        • Mission Control

        Mission Control功能变得更加简洁,它让用户能够更加轻松地查看和整理Mac上已打开的所有应用,只需轻扫一下,你桌面上的所有窗口便会在同一层展开。Mission Control还会将窗口按照它们在桌面上的相应位置进行排布,你可以更快找到想要的那个窗口,非常方便。 而当有很多窗口相互挤占桌面时,现在也有了更简单的方式来给它们腾出更多空间,只需将任何一个窗口拖至屏幕顶部,就能把它放入全新的桌面空间中。实际上,多桌面的概念在OS X上已经诞生很久了,这一次带来的体验要更佳。此外,当用户将某个应用窗口拖动到边框时,将能够自动调整该窗口的大小。可以说,OSX El Capitan在窗口管理方面的优化非常到位。

        • Spotlight         Spotlight搜索更加智能 它能够搜索更多的话题,包括天气、股票、体育、网络视频和交通信息等。用户也可以通过语音去执行Spotlight搜索

        • Call out your cursor

        通过快速滑动鼠标,可以快速找到光标位置。

        • Mail

        邮件应用新增了全屏显示功能和轻扫手势功能,其中轻扫手势功能类似于iOS中的邮件应用,只需向右轻扫就可以将邮件标记为已读或未读,或向左轻扫就可删除邮件,便于归类,查看邮件更加方便。

        • Notes

        备忘录功能得到了升级,除了文字之外,用户还可以在其中加入图片、视频和链接等。

        • Photos

        • Fonts

        备忘录功能得到了升级,除了文字之外,用户还可以在其中加入图片、视频和链接等。

        • Metal

        Apple为游戏开发者推出了新的平台技术 Metal,该技术能够为 3D 图像提高 10 倍的渲染性能。

Frameworks and Framework Technologies

        • New Frameworks

        Contacts (Contacts.framework) 访问通信录

        GameplayKit (GameplayKit.framework) 游戏开发工具库

        Metal (Metal.framework).提供基于GPU加速的3D图形渲染以及数据并行计算的功能

        MetalKit (MetalKit.framework)Metal功能的工具库

        Model I/O (ModelIO.framework)提供系统级别的3D资源模型访问

        Network Extension (NetworkExtension.framework).支持VPN技术

        • AppKit Framework Changes

        Detial reference by AppKit Release Notes for OS X v10.11 Appkit framework changes are as follows:

        • Security Enhancements

         App Transport Security (ATS)

        苹果加强APP内部网络访问的安全性,建议所有网络请求都使用HTTPS协议。Xcode 7 默认开启这个功能,可以在APP的Info.plist文件中配置不使用ATS.

        System Integrity Protection

        • UI testing 

         Xcode 7 + OSX 10.11 下可以编写UI测试代码

        • Deprecations

         OSX 10.11 不再支持运行时的垃圾回收

         OpenSSL headers 从OS X v10.11 SDK中彻底移除

         Apple stopped shipping OpenSSL with OS X some time ago, citing lack of a stable API from version to version.

        It’s a bit more subtle than that:

         Apple deprecated its OpenSSL shared libraries a while back (with OS X 10.7). That’s because OpenSSL doesn’t offer release-to-release binary compatibility, so we can’t update the shared libraries to the latest OpenSSL without breaking all the existing clients.

         At the same time we marked the OpenSSL headers in the OS X SDK as deprecated so you’d get deprecation warnings if you build with a deployment target of 10.7 or later.

         With the latest OS X SDK we’ve removed the headers entirely, making it much harder to use the long-since-deprecated shared libraries.

         We recommend that developers who need OpenSSL build their own copy of it and include that copy in their app. Alternatively you can use native OS X APIs, like Secure Transport.         苹果给的建议:

        1.开发者编译OpenSSL库并添加到自己的工程中

        2.使用Secure Transport库。

To learn more, visit http://www.apple.com/osx/whats-new/ - international.

        https://developer.apple.com/library/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_11.html - //apple_ref/doc/uid/TP40016227-SW1.

        https://developer.apple.com/library/mac/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html - //apple_ref/doc/uid/TP40001051-CH5-SW1

Sep 20, 2015 - Gif动画

Gif动画

        Appkit自带的NSImageView可以自动解析gif文件,根据gif文件关键帧生成动画。只要设置属性animates为YES时,就开启了动画动能。但是当父类View或自身开启layer-backed功能时,gif动画功能就不起作用了。

        其实解决这种问题,有多种方式吧。一种为子类化NSImageView,重写wantsUpdateLayer并返回YES。另外一种方式,就是自己解析gif文件,使用定时器,循环绘制各帧。

        本文打算使用第二种方式。思路大概如下:

1.使用NSImage加载gif文件。


2.从NSImage里获取实际表达图片数据的NSImageRep (NSImage其实类似于容器,NSImageRep才是正宗的跟图片数据相关的一种表达方式,对这一部分的理解,完全是个人观点,不知道理解的对不对)。


将NSImageRep类型转换成我们需要的类型NSBitmapImageRep,NSBitmapImageRep里面,我们感兴趣的属性包括NSImageFrameCount、NSImageCurrentFrame和NSImageCurrentFrameDuration。

各字段意义如下:
NSImageFrameCount:通过该字段,可以设置或获取gif图片总共多少帧动画。
NSImageCurrentFrame:通过该字段,可以设置或获取当前对应哪一个帧(值 <= 总帧数 - 1 )。
NSImageCurrentFrameDuration:通过该字段,可以设置或获取当前该帧动画的时间周期。


3.通过NSImageCurrentFrameDuration字段获取某一帧(当前帧为第0帧)的动画时间周期delaytime,开个定时间,每隔delaytime时间,我们重绘制一次,设置绘制的当前帧为下一帧(这里面做了一个简化处理,默认各帧动画时间意义,考虑到不一样的情况,请参考大神keefo写的代码:[https://github.com/keefo/gifdemo](https://github.com/keefo/gifdemo)),如此反复。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后附上demo(osx下oc与swift版本):[https://github.com/FyhSky/GifView_OC_Swift](https://github.com/FyhSky/GifView_OC_Swift)

Sep 14, 2015 - 基于libqrencode的二维码生成

基于libqrencode的二维码生成

        libqrencode是一个C语言编写的用来生成二维条形码的库,生成的二维条形码可以通过手机的CCD摄像机轻易的扫描出来。此库生成的二维码的容量多达7000个数字或4000个字符,并且具有很强的鲁棒性。

QR Code example

        目前,该库的稳定版本是3.4.4, 具有以下特点:

        

  • 运行时不需要其他额外的文件         

  • 快速的编码         

  • 输入数据的自动优化

        该库只支持日本工业标准X0510:2004 或 ISO/IEC 18004所规定的QR Code model 2模式,不支持如下功能: ECI and FNC1 mode QR Code model 1 具体介绍详见:http://fukuchi.org/works/qrencode/

        言归正传,本文就讲述如何使用该库一步步的生成osx或ios下的二维码 。步骤如下:

1.从http://fukuchi.org/works/qrencode/ 处下载稳定的版本。

2.解压下载的源代码包,将里面所有的.h和.c文件拷贝出来放在一个文件夹中,例如文件夹命名为libqrencode。

3.新建 工程,选择OSX的Application - > Cocoa Application –>Next.

填写好Produce Name , identifer随便填(反正不提交App store),然后Next,选择好存放工程目录,点解create创建工程成功.

4.将之前准备好的libqrencode文件夹下文件添加到工程中。 添加方法有多种,可以直接拖拽文件夹到工程,会弹出如下提示框。点击Finish完成添加。

5.必要的修改处理。

点击编译,会发现多处错误。

只看结果的可以直接删除qrenc.c文件,然后跳到添加宏定义部分第(2)部分并忽略第(4),想看问题是如何一步一步解决的,请继续往下看(其实最后qrenc.c文件还是要被删除的)。

(1)首先定位到qrenc.c文件中,发现#include 一行错误提示文件找不到(如果机器已经安装了png库,则不会有此提示)。解决办法安装png库,这个当然是个好主意,不过png的应该是跟这种格式文件相关的操作,而我们的初衷是只想生成二维码的数据,具体生成图片的格式应该不仅仅是这一种吧,所以我们赌一把删除此行再编译,神马??? 天哪,居然编译错误数飙升,呜呜呜。到此时,是不是内心已经崩溃了,不过搞技术这一行,应该具备面对困难,不屈不饶、宠辱不惊的心态。好,让我们硬着头皮看下去吧。继续在qrenc.c文件中摸索,咦,有新发现哎,writePNG函数显然是写PNG格式文件用的,在此我们用不到,嘿嘿,删掉 。

(2)继续编译,发现编译错误数立马少了好多。开心的不得了啊,继续排查,其他的错误提示都是都是__STATIC未定义。工程中搜索一下__STATIC,发现多处函数开头都有此定义,要一一修改的话好像有点麻烦,工程中肯定有那么一处,只要修改了该处就可以解决问题的。这种文件一般是预编译文件,或被共用的头文件。找啊找,找啊找,有一个可疑之处,每个文件都包含了这个。

这不是配置文件嘛,豁然开朗,这个就是配置编译使用的头文件。找了一下文件,没有找到,那我们就自己建一个吧。然后有一点需要注意的地方,必须开启这个HAVE_CONFIG_H的宏定义。 如下图找到Preprocessor Macros

在右侧添加值

至此,找个宏就被开启了,我们在config.h 文件中,定义#define __STATIC static

(3)然后继续编译

这几个是API的版本号,我们都可以在config.h中定义

static const char *MAJOR_VERSION = "3";
static const char *MINOR_VERSION = "4";
static const char *MICRO_VERSION = "4";
static const char *VERSION = "3.4.4";

(4)继续编译,发现writePNG已经被我们删除掉了,但是还在调用,所以删除调用的地方。再编译一下,还有最后一处错误duplicate symbol _main in。 main函数重定义,工程里面搜索一下main,最后定位到 qrenc.c中有个main函数, 额。。。, 原来找个文件是工程的测试文件啊,所以直接删除该文件,然后编译,哈哈哈哈,通过了。

库的移植这一部分搞定了,下面就是如何使用的问题了。

6.OC使用libqrencode这一部分,直接使用老外写的一个OC分装的生成图片的源代码。 其实就是类似那个WritePNG,自己解析成OSX下的NSImage 或 IOS下的UIImage.

最后附上代码部分:

OSX工程:https://github.com/FyhSky/QRCode_OC_MAC

IOS工程:https://github.com/FyhSky/QRCode_OC_IOS