第九章练习 A Selfie App - 开发一个自拍App吧

在本书的剩下的几章中,你将学习开发Selfie App然后提交到App Store。Selfie(自拍)App能够让用户拍照然后分享到Facebook(见图9-2),仅能在iPhone中使用,同时使用这章节学到的UIImagePickerController的相关知识点。

打开Xcode,顶部菜单栏选择File -> New Project。选择Single View Application,点击Next。

Page 244 | Chapter 9: Camera, Photos, and Social Network

Name一栏输入Selfie,Organization Name和Organization Identifier设置为你的名字不要有空格(见图9-3)。语言是Swift,Device选择iPhone,点击Next,保存文件。

屏幕显示工程信息信息,在Device Orientation区域,不勾选Landscape Left和Landscape Right选项(见图9-4)。

Exercise: A Selfie App | Page 245

滑倒底部找到Linked Frameworks and Libraries区域(见图9-5),点击左下角的加号,在搜索框中输入Social,选择Social.framework文件,点击Add。Social.framework文件出现在Project Navigator中了,把它拖到Supporting Files文件夹中。

Page 246 | Chapter 9: Camera, Photos, and Social Network

打开Main.storyboard文件(见图9-6)。从Object Library拖拽一个Image View,放到界面的中间,把Image View的四个边界拖拽到和界面一样大小,在Attribute Inspector中,把mode改为Aspect Fill。

选中Image View,从顶部菜单栏选择Editor -> Pin -> Leading Space to Superview;再次选中Image View,从顶部菜单栏选择Editor -> Pin -> Trailing Space to Superview;再次选中Image View,从顶部菜单栏选择Editor -> Pin -> Top Space to Superview;再次选中Image View,从顶部菜单栏选择Editor -> Pin -> Bottom Space to Superview。这样Image View就能够适配任何尺寸的设备了(见图9-7)。

Exercise: A Selfie App | Page 247

接下来你要添加一个navigation bar和两个按钮(见图9-8)。点击选中当前界面上的黄色圆圈,点击顶部菜单栏的Editor -> Embed In -> Navigation Controller。Navigator Controller出现在界面上了,双击navigation bar中间部分,输入Selfie。

Page 248 | Chapter 9: Camera, Photos, and Social Network

从Object Library中拖拽两个Bar Button Item到界面上,放到navigation bar的两侧,双击左侧Bar Button Item,命名为Take Selfie。双击右侧Bar Button Item,命名为Share(见图9-9)。

现在界面上的控件已经放置完毕了,需要把控件和ViewController.swift文件建立连接。打开Assistant Editor,隐藏Inspector和Document Outline,删除去掉viewDidLoad和didReceiveMemoryWarning方法。

接着按住Control键,点击Image View拖拽到ViewController.swift文件中,放到 class ViewController: UIViewController(见图9-10)的下方,然后松开鼠标,出现弹出框(见图9-11)。

Exercise: A Selfie App | Page 249

Connection选择Outlet,Name一栏输入myImageView,点击Connect。

按住Control键,把Take Selfie按钮拖拽到ViewController.swift文件中,放到 class ViewController: UIViewController(见图9-12)的下方,然后松开鼠标,出现弹出框(见图9-13)。

Page 250 | Chapter 9: Camera, Photos, and Social Network

Connection类型选择Action,Name一栏中输入selfieTapped,点击Connect。selfieTapped自动出现在ViewController.swift文件中。

按住Control键,把Share按钮拖拽到ViewController.swift文件中,放到 class ViewController: UIViewController(见图9-14)的下方,然后松开鼠标,出现弹出框(见图9-15)。

Exercise: A Selfie App | Page 251

Connection类型选择Action,Name一栏中输入shareTapped,点击Connect。shareTapped自动出现在ViewController.swift文件中。

在selfieTapped方法中添加下列代码:

@IBAction func selfieTapped(sender: AnyObject){
    var imagePicker = UIImagePickerController()
    imagePicker.delegate = self

    self.presentViewController(imagePicker, animated: true, completion: nil)

}

Page 252 | Chapter 9: Camera, Photos, and Social Network

第一行代码创建了UIImagePickerController并赋值给了变量imagePicker,第二行代码设定imagePicker的委托属性是当前的view controller,也就是.self。最后一行代码呈现imagePicker,呈现方式是modal,从屏幕下方出现,动画效果为真true。

刚刚写完的这方法出现了错误警告,imagePicker.delegate这行有问题,点击红点,显示:

Type “ViewController” does not conform to protocol ‘UIImagePickerControllerDelegate

这是Xcode让你知道ViewController实例必须要遵守UIImageViewControllerDelegate和UINavigationControllerDelegate两个协议。修改为下列代码:

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

按Command+B编译程序。Command+B编译程序能够编辑所有的代码但是不启动模拟器,在修复bug时,比较有帮助。

把鼠标光标放到imagePicker.delegate = self这行代码下方,增加下列代码:

if UIImagePickerController.isSourceTypeAvailable(.Camera) {

}  else  {

}

if语句检查当前设备的相机是否可用,如果可用,执行上半部分的代码,如果不可用,执行下半部分的代码。把if语句补充完整:

if UIImagePickerController.isSourceTypeAvailable(.Camera) {
    imagePicker.sourceType = .Camera

    if (UIImagePickerController.isCameraDeviceAvailable(.Front)) {
        imagePicker.cameraDevice = .Front
    } else {
        imagePicker.cameraDevice = .Rear
    }

}

上半部分中第一行代码是把imagePicker的sourceType属性设置为.Camera,第二行开始是一个if语句检查前置摄像头是否可用,如果可用,就把imagePicker.cameraDevice设置为.Front,这样默认摄像头就是前置摄像头了。如果不可用,使用后置摄像头。

Exercise: A Selfie App | Page 253

完成if语句isSourceTypeAvailable下半部分的代码:

 } else {
            imagePicker.sourceType = .PhotoLibrary
    }

当没有可用的摄像头时,下半部分的代码就会执行,这时PhotoLibrary就会出现。(见图9-16)

接下来添加didFinishPickingImage方法:

func imagePickerController(picker: UIImagePickerController!,didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!){

}

当用户选择了一张照片或者拍摄照片后,这个方法就会被调用。didFinishPickingImage方法有两个参数,第一个是UIImagePickerController,第二个参数是名为Image的UIimage,image参数存储用户选择或拍摄的那张照片。

修改添加下列代码:

func imagePickerController(picker: UIImagePickerController!,didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!){

    myImageView.image = image
    self.dismissViewControllerAnimated(true, completion: nil)
}

Page 254 | Chapter 9: Camera, Photos, and Social Network

第一行代码是把image参数值赋值给myImageView.image,这样myImageView就会展示image参数图片了。第二行代码是隐藏imagePicker。

把鼠标光标放到import UIKit下方,然后添加代码:

import Social

这行代码把Social.framework引入到ViewController.swift文件中,把鼠标光标放到shareTapped方法中,当用户点击Share按钮时,这个方法就被调用。在这个方法中需要完成两件事情:添加图片,显示Facebook的分享对话框。

在shareTapped():中添加下列代码:

var social = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
social.addImage(myImageView.image)

self.presentViewController(social, animated: true, completion: nil)

第一行代码创建了SLComposeViewController,设置service属性为Facebook。接着第二行代码把myImageView中的图片添加到Facebook分享框中,最后第三行代码,显示SLComposeViewController。

点击Play按钮(Command+R),App启动后,选中图片后点击Share,回车耍嘛一个提示框,显示iOS 模拟器没有Facebook帐号,需要去设置中添加Facebook帐号。一旦设置完成后,停止运行App,再次Command+R启动App(见图9-17)。

Exercise: A Selfie App | Page 255

如果App没有按照你想要的结果运行,或者程序有了错误或警告,不要太担心,学习的最佳方式就是试错,熟能生巧,到我们的网站上下载示例代码,对比一下代码,多试几次,直到搞定这个程序为止。

Page 256 | Chapter 9: Camera, Photos, and Social Network