天天品尝iOS7甜点 :: Day 22 :: Downloadable Fonts

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


在iOS中就预先安装了一些字体,但是这并不是完整的。为了能够节省磁盘的映射空间,iOS提供了一种机制用来下载和在运行的时候使用字体。

苹果提供了一组字体,它们可以被许可使用,包括非罗马字体,和一系列在桌面应用程序的字体。从iOS6开始,字体下载的功能已经能够使用了,但是在iOS7中,有一个更加大的字体列表可供使用.

下载字体存储在系统的某个地方——作为一个应用程序开发者,我们并没有权限去访问字体的存储空间。你需要用到的字体有可能已经被另外的程序请求下载了。然而,如果不是这样的话,而且用户也没有网络连接的情况下,所以我们的字体是不可用的。或者当有一个延迟的请求下载字体——我们等到字体可用的时候进行切换?

首先,我们需要在验证下载使用指定字体之前查看如何得到字体的列表,

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

天天品尝iOS7甜点 :: Day 21 :: Multi-column TextKit text rendering

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


在过去,要想在iOS中创建多列的布局的文字是十分困难的:可能你可以创建多个UITextView然后手动剪裁文字来填充到不同的视图中,如果是动态内容的话就悲剧了,或者你可以调用更加底层的CoreText布局引擎,但是这个并不是那么容易使用的。

在iOS7中有关TextKit的介绍就改变了这些,并且它变得很易用,可以用来创建不同的文字排版,包括多页,多列和禁区。在今天的文章中我们将会看查查如果使用它来构建一个多列的文字展示,它渲染成一个简单的文本文件。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

TextKit

TextKit是一个巨大的框架,在今天的文章中,我们并不会去详细的解释它全部的东西,为了能够弄懂多列的排版项目,其中有4个类我们会很熟悉的:

  • NSTextStorage: 是NSAttributedString的子类,并且包含了内容和我们希望渲染的标记的文本。它使编辑和保存相关布局管理器的引用来通知底层的文本存储。
  • NSLayoutManager: 代表管理渲染存储中的文本在一个或者多个容器对象中。把底层的unicode字符转换成图形。可以有多个文本容器允许不同地区之间流动的文本。
  • NSTextContainer: 定义当前要渲染文本的所有区域。这是提供的字形布局管理器,它指定填充该区域。可以使用UIBezierPath对象作为禁区。
  • UITextView: 真实的渲染文本到屏幕上面。在iOS7中它有所更新,添加了一个NSTextContainer的构造。

我们将会使用这些类来创建多列的文本视图。如果你要更深入的获得有关TextKit的架构信息并且如何来使用,可以查看TextKit Tutorial

天天品尝iOS7甜点 :: Day 20 :: View controller content and navigation bars

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

今天的这篇文章将会和之前的文章有些小小的不同。采用iOS7依赖,许多开发者都在处理视图控制器在UINavigationControllers的navigation bar后面的问题。我们将要来看看为什么,然后视图解释如何获得自己所需要的行为.

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

iOS7 View Controller Changes: The theory - iOS7视图控制器的改变:理论部分

在iOS7中所有的试图控制器都是全屏的布局,这就意味着wantsFullScreenLayout属性已经被弃用了。然而,我们现在有额外的方法来控制试图控制器的显示问题。下面的这些配置属性可以通过代码和interface builder来使用:

  • edgesForExtendedLayout:这个属性定义的是视图边缘如何扩展到屏幕的边缘。默认的值是UIRectEdgeAll
  • extendedLayoutIncludesOpaqueBars:如果试图控制器是半透明的,默认的边缘将会扩展在bar的下面。然而设置这个属性为YES,就会让边缘扩展到不透明的bar下面。
  • automaticallyAdjustsScrollViewInsets:这个属性是非常强大的属性。如果你的视图中包含了一个滚动视图,然后它将会有自己的内容嵌入,所以自身的内容将会滚动到bar的下面,但是可以滚动看到所有的内容。这个属性默认是YES,并且这是iOS7推荐的行为。
  • topLayoutGuid, bottomLayoutGuide:这些属性将会生成匹配视图可见区域的扩展,也就是,如果有屏幕的上方有一个bar,然后topLayoutGuide将会定位在底部的bar上面。

天天品尝iOS7甜点 :: Day 19 :: UITableView Row Height Estimation

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

今天我们将会来查看一个相当小的额外的UIKit API,其中一个就是复杂的表格来影响用户体验。估算行高是在表格的代理方法中的一个额外的方法进行设置,它不仅仅可以返回默认的行高,还可以返回估算的高度来进行替换。我们将会查看为什么这属于一个高级的部分。为了能够能够验证这些,我们需要构建一个简单的应用,它里面有一个表格,可以让我们看到具有估算高度和没有估算高度的示例。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Without estimation - 没有估算

我们通过UITableViewController来创建一个简单的UITableView.它包含了一个section200行数据。没有单元包含了包含他们自己的索引和高度。如果所有的行都是具有相同高度,那么我们就不需要去实现代理中的heightForRowAtIndexPath:方法,然后我们也不需要去使用新的估算方法来改善什么东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Retur the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 200;
}

- (UITableViewCell *)tableView:(UITableView *)tableview cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

// Configure the cell...
cell.textLabel.text = [NSString stringWithFormat:@"Cell %03d", indexPath.row];
CGFloat height = [self heightForRowAtIndex:indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Height %0.2f", height];
return cell;
}

天天品尝iOS7甜点 :: Day 18 :: Detecting Facial Features with CoreImage

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

运用AVFoundationCoreImage,从iOS5开始就介绍了有关脸部识别的功能。在iOS7中,运用CoreImage进行脸部识别已经改进了许多新的识别特性(包括微笑和眨眼).这个API是十分简单易用的,所以我们创建一个应用程序,它运用AVFoundation进行查找脸部,然后在使用CoreImage来对寻找照片中的微笑和闭眼。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Face detection with AVFoundation - 运用AVFoundation进行面部识别

Day 16中,我们使用AVFoundation中的AVCatpureMetadataOutput类来寻找和解析二维码。面部识别也是使用同样的方式,和二维码一样都是metadata对象。我们将会创建一个AVCaptureMetadataOutput对象,但是它具有不懂的metadata类型:

1
2
3
4
5
6
7
AVCaptureMetadataObject *output = [[AVCaptureMetadataOutput alloc] init];
// Have to add the output before settig metadata types
[_session addOutput:output];
// We're only interested in faces
[output setMetadataObjectTypes:@[AVMetadataObjectTypeFace]];
// This VC is the delegate, Please call use on the main queue
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

天天品尝iOS7甜点 :: Day 17 :: iBeacons

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

在iOS7发布主题中并没有很详细的提及到iBeacons概念。在Bluetooth LE中有些新的特性可以允许近距离的通知和测距。简单的使用通知的是当你接近一个商店的时候然后收到一组特价商品的列表,或者接近你付款账单的时候可以收到发票信息。另外还有很多其他的地方可以使用,我相信在未来的时间里面将会出现一些更加深入创造性的功能。

今天,我们将会查看如何让一个iOS设备扮演成一个iBeacon,并且怎样使用一个不同的设备来估算出到iBeacon设备的距离。我们将会创建一个基于”Hot/Cold”捉迷藏的游戏,iBeacon设备可以隐藏,然后寻找器显示更新估算它们之间的距离。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

天天品尝iOS7甜点 :: Day 16 :: Decoding QR Codes with AVFoundation

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

在昨天,我们已经查看了CoreImage中包含的新的过滤器中的一些,并且发现在iOS7中,我们可以有能力自己生成一个二维码。所以,既然给出了如何生成二维码,就需要能够对这个二维码进行解码,当然不能让你失望了,我们在今天的文章中就来介绍如何使用AVFoundation框架中的一些新特性进行解码二维码。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

AVFoundation pipeline - AVFoundation工作流

AVFoundation是一个大的框架,它可以促进创建,编辑,显示和捕获多媒体。这篇文章并不是主要介绍如何使用AVFoundation,而是我们要通过这个框架来提取手机屏幕上面的二维码,为了能够使用这个框架,我们首先需要导入这个框架:

1
@import AVFoundation;

天天品尝iOS7甜点 :: Day 15 :: CoreImage Filters

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

在iOS5中就引入了CoreImage这个框架,它是用来进行图像处理的。它抽象所有低级的与图像处理有关联的方法,从用户角度提供易于使用的过滤事件链架构。i0S7中介绍了新的过滤器,其中的一些,我们将会在进行的文章中介绍,我们将会来看看一些传统的图像过滤效果,然后在查看创建具有过滤效果的生成二维码的效果。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Photo Effect Filters - 图像过滤效果

在移动应用程序世界里,能够应用比较酷的图片效果是一种趋势。例如instagram就十分的流行。CoreImage添加了很多十分简单的是可以使用的过滤效果来帮助我们在应用程序中添加很多功能。

为了能够使用这些过滤器,我们需要首先为CoreImage做点功课。CoreImage指定它自己的图像类型-CIImage,它可以从很多不同的源被创建,包括与CoreGraphics等价的CGImage

1
2
UIImage *_inputUIImage = [UIImage imageNamed:@"shinobi-badge-head.jpg"];
CIImage *_inputImage = [CIImage imageWithCGImage:[_inputUIImage CGImage]];

天天品尝iOS7甜点 :: Day 14 :: Interactive View Controller Transitions

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

回顾Day 10,我们已经介绍了如何在导航(navigation)视图中创建自定义的平滑转换效果。交互式试图控制器转换添加了另外的维度,允许用户进行交互式控制,通常是手势操作。

今天的文章将会查看如何为一个模态的试图控制器创建一个交互式视图转换,使用一个类似于翻牌的效果。视图的翻拍效果动画,随着用户的手势变化而变化。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Flip Transition Animation - 翻转过渡效果

交互转换扩大了自定义的动画,因此我们需要自己创建一个自定义的渐变动画。我们需要一个对象适配了UIViewControllerAnimatedTransitioning协议.

1
2
3
@interface SCFlipAnimate: NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic, assign) BOOL dismissal;
@end

天天品尝iOS7甜点 :: Day 13 :: Route Directions with MapKit

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

对于iOS中的地图框架,在iOS7中添加了一些些小小的改变。一个简单的添加的例子就是我们可以通过两点来或者它们之间的路径。在今天的文章中,我们将会看看如何来使用这个简单的API构建一个一件的查询路径的应用程序。通过这个还可以看看添加层的渲染的API。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Requesting Directions - 查询路线请求

MapKit中,我们需要用到很多不同的类,但是我们使用的时候却是非常简单的。为了能够获取到Apple的路径集合服务,我们需要把信息封装到MKDirectionsRequest对象中。自从iOS6中就包含了此类,不过只是提高给Apple内部进行生成查询路线,但是在iOS7中已经得到了扩展,允许开发者进行请求指示。

1
MKDirectionsRequest *directionsRequest = [MKDirectionsRequest new];

为了封装一个请求,我们需要设置开始和结束的点,它们都是MKMapItem对象。这些对象可以代表地图上面的位置,包含自身的坐标和其他一些元数据(例如:名称,电话号码和URL)。创建它们有很多的选项。下面是其中一个使用用户当前的坐标的:

1
MKMapItem *source = [MKMapItem mapItemForCurrentLocation];

当用户启动第一次启动应用程序的时候,就会弹出一个询问是否使用他们当前位置权限的对话框:

,