May 22, 2017

GCD 常见用法速查小手册

提交 block

在主队列提交一个异步 block

dispatch_async(dispatch_get_main_queue(), ^{

//Your codes

});

在默认优先级的全局队列提交一个同步 block,请尽量使用默认优先级,除非你真的知道你在做什么。

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//Your codes

});

dispatch_once

static dispatch_once_t onceToken;

for (......

February 24, 2016

Swift 的 autoclosure

Swift 的 autoclosure

在 Swift 中,如果一个函数,接收一个 closure 作为参数,我们可以这么写:

func op() -> Int {

return 8

}

func function(a: () -> Int) {

print(a())

}

//调用

function{ op() } //打印8

如果这个参数使用 autoclosure 修饰,则可以这么写:

func op() -> Int {

return 8

}

func function(@autoclosure a: () -> Int) {

......

February 15, 2015

利用 CocoaLumberjack 搭建自己的 Log 系统

一直需要一个 Log 系统,可以将程序运行过程中打的 log 发送到自己服务器,方便之后数据分析或者除错。之前也尝试过找一些第三方服务,但看来看去,国内貌似没看到专门做这一块的,而国外看了下有 Loggly,似乎满足需求,但它要收费且日志保存时间太短。后来无意间看了下 Loggly 提供的 SDK 源代码,发现了 CocoaLumberjack 这个好东西,而 Loggly 其也不过就是在 CocoaLumberjack 上自定义了 Logger 和 Formatter 而已。自己做的话,也很简单。

先说下需求,我理想中的 Log 系统需要:

可以设定 Log 等级

可以积攒到一定量的 ......

November 20, 2014

WatchKit 之 数据共享

本文将介绍如何使 Watch App 与 iOS App 之间进行数据共享

App Group

App Group 是一个 App 与其扩展均可以访问的本地文件系统的一块区域。由于 Watch App 与 iOS App 是在不同的沙盒环境下运行,正常情况下他们彼此无法分享数据,因此,我们需要创建一个 App Group,使的它们拥有一个共享的文件区域。

点击项目,在 target 里分别打开项目本身和 Watch App 的 App Groups,点击加号,添加一个 App Group,输入一个唯一的标识符。我们之后会在 Watch App 和 iOS App 中通过该标识符访问同一个......

November 20, 2014

WatchKit 之 导航

在 Watch App 中,当涉及到多个界面跳转时,我们共有两种导航方式可使用:Hierarchical 与 Page-based。本文将对这两种导航方式以及 Modal 展现方式做简单的介绍。

Page-based

Page-based 是类似现在很多 iOS 第一次启动的介绍页面的 paged scrollview 那样,可以左右滑动翻页。(题外话,我很反感第一次启动的介绍页的设计)

创建 Page-based 界面必须使用 storyboard。创建方式很简单,只需在 interfaceController 之间创建多个 next page 类型的 segue 就可以了。Page 的......

November 19, 2014

WatchKit 的 WKInterfaceTable 简单使用

WKInterfaceTable 类似 UITableView, 其用途即展示一个表格并且用户可以与之交互。但不同的是 WKInterfaceTable 的功能更加简单,使用上也很粗暴直接。

本文一步步演示了创建一个简单的包含 WKInterfaceTable 的 Apple Watch App!

我们首先按照老办法,创建一个 Single View Application 模板的 iOS 应用。

工程创建好后,点击 File -> Add -> Target,选择 Apple Watch 标签下的 Watch App。Xcode 会添加一个工程名 Watch App 目录。同......

November 16, 2014

ScrollView 与 Autolayout

初学 Autolayout,当涉及到 ScrollView 时,很多人面对满屏幕红色错误不知所措,为什么明明以前没问题的约束到了这儿就成了错误。

比如下面这种情况:

image

一个蓝色的 UIView,设其长宽约束分别为 210,200。上、左和右间距为 55。如此设置这个 View 的位置就被确定了。没有错误,没有警告。

可同样的方法,到 UIScrollView 却有触目惊心的红色错误:

September 21, 2014

Swift中类的初始化器与继承

本文算是对苹果官方一书中关于类的初始化器与其继承部分的整理笔记。内容较基础,已看过该书的就不用浪费时间阅读啦。

首先,Swift 为类定义了两种初始化器来确保类中所有的储存属性都能得到一个初始化值。这两种初始化器就是「指定初始化器」(Designated Initializer)与「便利初始化器」(Convenience Initializer)。

指定初始化器与便利初始化器

指定初始化器是类的最主要的初始化器,它会将类中所有的属性赋值初始化,并且一路往上调用类的父类的指定初始化器去初始化它们各自引入的属性。类可以有许多个指定初始化器,也可以只有一个,但必须至少有一个。

便利初始化器顾......

September 21, 2014

iOS 8 Presentation Controller

本文搬运自 Dative Studios,作者 Pete Callaway。

iOS 8 新加入一个类:UIPresentationController,它与 iOS 7 新添加的几个类与协议一道,帮助我们方便快捷地实现 ViewController 的自定义过渡效果。我发现要搞懂一个新的 API,最快的方法还是写一个例子。废话不多说,上例子!

Header

该项目在GitHub可以下载

实现自定义过渡

我们需要两个对象来实现自定义过渡,一个 UIPresentationController 的子类以及一个......

June 30, 2014

Injection Plugin for Xcode

Alt text

介绍

Injection Plugin For Xcode 是 Xcode 上的一个插件。利用它可以修改应用代码,实时在模拟器或实机上看到效果而不需要重启应用。

安装

点此下载 Injection Plugin for Xcode

安装后,重启Xcode,会发现在 Product 菜单下多了两个选项:

001

点击 Product > 你的工程名 > Patch Project for Inje......

June 07, 2014

id 与 Swift 中的 AnyObject

Objetive-C 的开发者都知道其有一个类型 id,类似 C 中的 void*,是一个万精油的类型,可以指向任何对象。比如我们可以让一个 object 为 NSString:

id object = @“Hello, World!”;

也可以指向其他东西:

object = @1024;

因为 id 是个对象,我们可以向它发消息:

[object lastObject];

在 Swift 中,有一个相应的 AnyObject 类型来表示任何类型:

var object: AnyObject = “Hello, World!”

object = 1024

object.la......

April 19, 2014

字体加载三种方式

这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式。

header

静态加载

这个可以说是最简单最直观的一种加载自定义字体的方式。只要字体包含到工程中,然后修改工程的 plist 文件,添加 Fonts provided by application 字段,并把要添加的字体文件名写入这个数组。

addStaticFont

之后直接使用即可

- (void)staticLoad

{

self.staticFont......

April 12, 2014

iOS 7 键盘动画

iOS 7 键盘弹出用了一个新的 UIViewAnimationOptionCurve。其值为 7,但不论头文件还是文档都没有提及这个新的 curve。

头文件中的 curve 一览:

UIViewAnimationOptionCurveEaseInOut = 0 << 16, // default

UIViewAnimationOptionCurveEaseIn = 1 << 16,

UIViewAnimationOptionCurveEaseOut = 2 << 16,

UIV......

April 06, 2014

PurineCheck - 食品嘌呤含量查询器

Header

This is the support page for PurineCheck

April 05, 2014

iOS 7 交互式过渡

本文搬运自 Dative Studios,作者 Pete Callaway。

iOS 7 新加入了一个介于 ViewController 之间的过渡的实现方法。本文将介绍如何利用自定义的过渡实现如图所示效果。

Header

在这个例子中,我们将在两个 viewConrtoller 的转换过程中加入一个自定义的过渡。DSLFirstViewController 是我们的第一个 viewController,其包含一个 CollectionView,每一个 Cell 都包含一张图片和一个标签。DSLSecondVie......