在这个两部分的系列教程中,您将探索如何使用以下工具和技术来创建自己的App:
- Cocoapods
- Manual layout in code(纯代码布局)
- ReactiveCocoa
- OpenWeatherMap
本教程专为熟悉基本知识的、但还没有接触到太多高级主题的中级开发者而设计。本教程也是想要去探索Objective-C函数编程一个很好的开始。
开始
打开Xcode并执行File\New\Project
。选择Application\Empty Application
。将项目命名为SimpleWeather
,单击下一步,选择一个目录去保存你的项目,然后点击Create。 现在,你的基础项目已经完成。下一步是集成你的第三方工具。但首先你要关闭Xcode
,确保他不会影响下一步。
Cocoapods
你将要下载Cocoapods的代码,在Xcode项目中添加文件来使用,并配置项目需要的设置。
Mantle
Mantle是由于Github团队开发的,目的是去除Objective-C把JSON数据转为NSObject子类的所有样板代码。Mantle也能做数据转换,通过一种神奇的方式把JSON原始数据(strings, ints, floats)转换为复杂数据,比如NSDate, NSURL, 甚至是自定义类。
LBBlurredImage
LBBlurredImage是一个继承自UIImageView,轻而易举使图像模糊的项目。你将仅仅用一行代码来创建一个神奇的模糊效果。
TSMessages
TSMessages 是另一个非常简单的库,用来显示浮层警告和通知。当出现错误信息而不直接影响用户的时候,最好使用浮层来代替模态窗口(例如UIAlertView),这样你将尽可能减少对用户的影响。
你将只用TSMessages,在网络失去连接或API错误的时候。如果发生错误,你将看到类似这样的一个浮层:
ReactiveCocoa
最后,你将使用到ReactiveCocoa,他也来自于GitHub团队。ReactiveCocoa给Objective-C带来了函数编程,类似与.NET的Reactive Extensions。你将在第二部分花费大部分时间去实现ReactiveCocoa。
设置你的Cocoapods
设置你的Cocoapods,先要确保你已经安装了Cocoapods。为此,打开命令行程序,并输入。
1 |
which pod |
你将会看到类似这样的输出:
1 |
/usr/bin/pod |
这决定于你如何管理Ruby gems,例如你使用rbenv或RVM,路径可能有所不同。
如果命令行简单的返回提示,或显示pod not found
,表示Cocoapods未安装在你的机器上。可以查看我们的Cocoapods教程作为安装说明。这也是一个很好的资源,如果你想更多得了解Cocoapods的话。
1 |
sjpsega注:Cocoapods中文安装教程可以看这篇 http://geeklu.com/2013/06/cocoapods-101/ |
Podfiles是用来告诉Cocoapods哪些开源项目需要导入。
要创建你的第一个Cocoapod,首先在命令行中用cd
命令导航到你的XCode项目所在的文件夹,在命令行中启动编辑器,输入
1 2 3 4 5 6 |
platform :ios, '7.0' pod 'Mantle' pod 'LBBlurredImage' pod 'TSMessages' pod 'ReactiveCocoa' |
这文件做了两件事情:
- 告诉Cocoapods你的目标平台与版本,这里的你目标是iOS 7.0。
- 列给Cocoapods一个项目所有需要引入和安装的三方库清单。
在命令行中输入pod install
进行安装。
这可能需要花一到两分钟的时间去安装各种包。你的命令行应该输出如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ pod install Analyzing dependencies CocoaPods 0.28.0 is available. Downloading dependencies Installing HexColors (2.2.1) Installing LBBlurredImage (0.1.0) Installing Mantle (1.3.1) Installing ReactiveCocoa (2.1.7) Installing TSMessages (0.9.4) Generating Pods project Integrating client project [!] From now on use `SimpleWeather.xcworkspace`. |
1 |
sjpsega注:若你之前安装过Cocoapods的话,这里安装报错的话,可以看看http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/ 修复问题 |
Cocoapods会在你的项目目录中创建一堆新文件,但是,只有一个需要你关心,SimpleWeather.xcworkspace
。
用Xcode打开SimpleWeather.xcworkspace
。看看你的项目设置,现在有一个Pods项目在你的项目工作区,以及在Pods文件夹放着每一个你引入的库,如下所示:
确保你已经选择SimpleWeather项目,如图所示:
构建并运行您的App,以确保一切工作正常:
1 |
提示:您可能会注意到有一些项目生成警告。因为Cocoapods引入的项目,是由不同的开发者开发,并且不同的开发者对生成警告有不同的态度。通常,你应该可以忽略它们。只要确保没有任何编译器错误! |
创建你的主视图控制器
虽然这个App看起来复杂,但它还会通过一个单一的View Controller完成。现在,你将添加他。
选中SimpleWeather
项目,单击File\New\File
,并且选择Cocoa Touch\Objective-C class
. 命名为WXController
,并设置为UIViewController
的子类。
确保Targeted for iPad
和With XIB for user interface
都没有选中,如下图所示:
打开WXController.m
然后用如下所示替换-viewDidLoad
方法:
1 2 3 4 5 6 |
- (void)viewDidLoad { [super viewDidLoad]; // Remove this later self.view.backgroundColor = [UIColor redColor]; } |
现在打开AppDelegate.m
,并且引入如下两个class:
1 2 |
#import "WXController.h" #import <TSMessage.h> |
眼尖的读者会注意到WXController
使用引号引入,TSMessage
使用单括号引入。
回头看下当你创建Podfile的时候,你使用Cocoapods引入TSMessage
。Cocoapods创建TSMessage项目,并把它加入到工作空间。既然你从工作区的其他项目导入,可以使用尖括号代替引号。
代替-application:didFinishLaunchingWithOptions
的内容:
1 2 3 4 5 6 7 8 9 10 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 1 self.window.rootViewController = [[WXController alloc] init]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; // 2 [TSMessage setDefaultViewController: self.window.rootViewController]; return YES; } |
标号注释的解释:
- 初始化并设置
WXController
实例作为App的根视图控制器。通常这个控制器是一个的UINavigationController
或UITabBarController
,但在当前情况下,你使用WXController
的单个实例。 - 设置默认的视图控制器来显示你的TSMessages。这样做,你将不再需要手动指定要使用的控制器来显示警告。
构建并运行,看看你的新视图控制器起作用了。
在红色背景下,状态栏有点不够清晰。幸运的是,有一个简单的方法,使状态栏更清晰易读。
在iOS7,UIViewController有一个新的API,用来控制状态栏的外观。打开WXController
,直接添加下面的代码到-viewDidLoad:
方法下:
1 2 3 |
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } |
再次构建并运行,你将看到状态栏如下的变化:
设置你的App视图
现在是时候让你的App接近生活。下载这个项目的图片,并解压缩到一个合适的位置。这个压缩包的背景图片出自Flickr用户idleformat之手,天气图片出自Dribbble用户heeyeun之手。
切换回Xcode,单击File\Add Files to “SimpleWeather”
….定位到你刚刚解压缩的图片文件夹并选择它。选择Copy items into destination group’s folder (if needed)
,然后单击Add
。
打开WXController.h
, 添加如下委托协议:
1 |
<UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate> |
现在打开WXController.m
。 小提示:你可以使用Control-Command-Up
的快捷键来实现.h
和.m
文件之间的快速切换。
添加如下代码到WXController.m
顶部:
1 |
#import <LBBlurredImage/UIImageView+LBBlurredImage.h> |
LBBlurredImage.h
包含在Cocoapods引入的LBBlurredImage
项目,你会使用这个库来模糊背景图片。
应该有一个空的私有接口样板在WXController
imports的下方。它具有以下属性:
1 2 3 4 5 6 7 8 |
@interface WXController () @property (nonatomic, strong) UIImageView *backgroundImageView; @property (nonatomic, strong) UIImageView *blurredImageView; @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, assign) CGFloat screenHeight; @end |
现在,是时候在项目中创建并设置视图。
下面是你App的分解图,记住,table view将是透明的:
为了实现动态模糊效果,在你的App中,你会根据App的滚动来改变模糊图像的alpha值。
打开WXController.m
,使用如下代码来,替换掉-viewDidLoad
中设置背景色的代码: