338
14
14.2
音频附件
接下来要添加的附件用于录制和播放音频。为此,我们将使用
AVFoundation
框架,它
包含两个类:
AVAudioRecorder
用于录制音频,
AVAudioPlayer
用于播放音频。
这里只涵盖了
iOS
音频功能的皮毛。如果想进一步学习
iOS
中处理音频的框架,请
阅读
Apple
的文档(
http://apple.co/22UK1pM
)。
首先,添加这个屏幕所需的图标。
1.
打开
Assets.xcassets
2.
Audio
Record
Play
Stop
等图标添加到静态资源目录中。
接下来,在附件类型列表中添加音频。
1.
把下述代码添加到
addAttachment
方法中:
func addAttachment(sourceView : UIView) {
let actionSheet
= UIAlertController(title: "Add attachment",
message: nil,
preferredStyle: UIAlertControllerStyle
.ActionSheet)
//
如果可以使用相机
……
if UIImagePickerController
.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
//
这个变量的值是一个闭包,显示图像拾取器或者让用户授予权限
var handler : (action:UIAlertAction) -> Void
switch AVCaptureDevice
.authorizationStatusForMediaType(AVMediaTypeVideo) {
case .Authorized:
fallthrough
case .NotDetermined:
//
如果有权限,或者不知道已经被禁止了,这个闭包显示图像拾取器
handler = { (action) in
self.addPhoto()
}
default:
//
否则,轻点这个按钮时请求授权
handler = { (action) in
let title = "Camera access required"
let message = "Go to Settings to grant permission to" +
多媒体、联系人、位置和通知
339
"access the camera."
let cancelButton = "Cancel"
let settingsButton = "Settings"
let alert = UIAlertController(title: title,
message: message,
preferredStyle: .Alert)
// Cancel
按钮关闭这个提醒框
alert.addAction(UIAlertAction(title: cancelButton,
style: .Cancel, handler: nil))
// Settings
按钮打开应用的设置页面,让用户授权
alert.addAction(UIAlertAction(title: settingsButton,
style: .Default, handler: { (action) in
if let settingsURL = NSURL(
string:UIApplicationOpenSettingsURLString) {
UIApplication.sharedApplication()
.openURL(settingsURL)
}
}))
self.presentViewController(alert,
animated: true,
completion: nil)
}
}
//
两种情况下都显示
Camera
选项
//
选择这个选项后运行相应的代码
actionSheet.addAction(UIAlertAction(title: "Camera",
style: UIAlertActionStyle.Default, handler: handler))
}
actionSheet.addAction(UIAlertAction(title: "Location",
style: UIAlertActionStyle.Default, handler: { (action) -> Void in
self.addLocation()
}))
> actionSheet.addAction(UIAlertAction(title: "Audio",
> style: UIAlertActionStyle.Default, handler: { (action) -> Void in
> self.addAudio()
> }))
actionSheet.addAction(UIAlertAction(title: "Cancel",
style: UIAlertActionStyle.Cancel, handler: nil))
//
如果在
iPad
中,呈现一个与源视图连接的弹出框
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad {
actionSheet.modalPresentationStyle
340
14
= .Popover
actionSheet.popoverPresentationController?.sourceView
= sourceView
actionSheet.popoverPresentationController?.sourceRect
= sourceView.bounds
}
self.presentViewController(actionSheet, animated: true,
completion: nil)
}
与支持位置附件时一样,我们也要为音频附件添加一个条目。
2.
addAudio
方法添加到
DocumentViewController
中:
func addAudio() {
self.performSegueWithIdentifier("ShowAudioAttachment", sender: nil)
}
此外,当用户选择添加音频附件时,我们要触发正确的
segue
3.
打开“
File
”菜单,选择“
New
”→
File
”。
4.
创建一个
UIViewController
子类,名为
AudioAttachmentViewController
5.
打开
AudioAttachmentViewController.swift
6.
AVFoundation
框架导入视图控制器。这个框架包含处理加载、播放和暂停音频所
需的一切。
7.
AudioAttachmentViewController
类符合
AttachmentViewer
AVAudioPlayerDelegate
协议:
class AudioAttachmentViewController: UIViewController, AttachmentViewer,
AVAudioPlayerDelegate
8.
添加
AttachmentViewer
协议所需的
attachmentFile
document
属性:
var attachmentFile : NSFileWrapper?
var document : Document?
9.
添加录制、播放和停止按钮(稍后添加)的
outlet
属性:
@IBOutlet weak var stopButton: UIButton!
@IBOutlet weak var playButton: UIButton!
@IBOutlet weak var recordButton: UIButton!
10.
最后,添加音频播放器和录音机:
多媒体、联系人、位置和通知
341
var audioPlayer : AVAudioPlayer?
var audioRecorder : AVAudioRecorder?
下面设计用户界面。
11.
打开
Main.storyboard
12.
拖曳一个视图控制器,
Identity Inspector
中把它的类设为
AudioAttachmentView-
Controller
13.
按住
Control
,从文档视图控制器拖曳到这个新加的视图控制器上。从弹出的
segue
类型列表中选择“
Present As Popover
”。
把这个
segue
的“
Anchor
”设为文档视图控制器的视图。
把这个
segu
的标识符设为
ShowAudioAttachment
我们将使用叠放视图管理那三个按钮。三个按钮一次只显示一个,而且显示在屏幕
中央。我们不会把三个按钮重叠在一起,而是放在一个居中的叠放视图中。
14.
在对象库中搜索
UIStackView
拖曳纵向叠放视图到音频附件视图控制器的界面中(见
14-2
)。
14-2
纵向叠放视图
342
14
15.
把叠放视图放到界面的中央。然后,单击右下角的
Align
”按 ,勾 选“
Horizontally
in container
”和“
Vertically in container
”。单击“
Add 2 Constraints
”。这一步为叠
放视图添加居中约束。
16.
拖曳一个
UIButton
到叠放视图中。
Attributes Inspector
中,把类型设为
Custom
”,
删除标注文本,再把图像设为
Record
添加按钮后,叠放视图的尺寸会匹配按钮的尺寸。这正是我们期望的!
17.
重复这个过程,再添加两个按钮,分别使用
Play
Stop
图标。
添加完之后,叠放视图如图
14-3
所示。
14-3
音频附件视图控制器的界面

Get Swift学习手册 now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.