body { font-size: 13pt; color: #222; background: #fbfbfb; font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; line-height: 1.4; margin: 10% }
h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111 }
h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; margin-top: 2em }
h2 { font-size: 2em; margin-bottom: 0.75em; margin-top: 1.5em }
h3 { font-size: 1.5em; line-height: 1; margin-top: 1.5em }
h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em }
h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em }
h6 { font-size: 1em; font-weight: bold }
h1 img,h2 img,h3 img,h4 img,h5 img,h6 img { margin: 0 }
img { max-width: 100% }
p { margin: 0 0 1.5em }
a:focus,a:hover { color: #09f }
a { color: #06c; text-decoration: underline }
blockquote { margin: 1.5em; color: #666 }
strong,dfn { font-weight: bold }
em,dfn { font-style: italic }
del { color: #666 }
pre { margin: 1.5em 0; white-space: pre }
pre,code,tt { font: 1em "andale mono", "lucida console", monospace; line-height: 1.5 }
li ul,li ol { margin: 0 }
ul,ol { margin: 0 3em 1.5em 1.5em; padding-left: 1.5em }
ul { list-style-type: disc }
ol { list-style-type: decimal }
figure { margin: 1.5em 0; width: 100%; text-align: center }
figcaption { font-size: 0.75em; padding: 0.5em 2em; margin-bottom: 2em }
figure img { margin-bottom: 0px }
code { font-family: Menlo, monospace; font-size: 90% }
p>code { padding: 0.2em 0.4em; background: #e1e9ed }
pre { text-align: left; color: #d3bd7e; background: #202020; padding: 10pt 15pt }
hr { border: 0px; border-top: 1px solid #ddd; border-bottom: 1px solid #fff; margin-top: 4em; margin-bottom: 2em }
h1+hr { margin-top: 2em }
ol#footnotes { font-size: 0.75em; padding-top: 1.5em; margin-top: 3em; margin-left: 0 }
ol#footnotes::before { content: "———"; letter-spacing: -4px; margin-left: -1.5em }
ol p,ul p { margin-bottom: 0px }
li { margin-bottom: 0.75em; margin-top: 0.75em }
a:target,ol#footnotes li:target,sup a:target { }
a:target { border: 0; outline: 0 }
关于录音按钮的一些总结
关于录音按钮的一些总结
按住录音, 上滑松手取消, 上滑不松下滑到按钮上继续录音
这个需求总结了一下网上的思路, 大概有如下几种
- 在 touchesBegan, touchesMoved, touchesEnded 三个方法中通过判断当前触摸的点的坐标与按钮的热区范围的关系作出相应反应
- 添加长按手势, 对手势的 gestureRecognizerStaeBegin, changed, ended 三种状态判断此时手指位置与按钮关系, 从而有不同反应.
- 对按钮的所有几种点击事件进行不同处理, touchUpInside, touchDown, touchUpOutside, touchCancel, touchDragExit, touchDragEnter, 主要是为这六个点击事件绑定方法进行监听, 至于每种方法做什么的从名字上还是很简单能够分辨的
大致优劣比较
- 三个方法只需要重写就可以了, 不需要再去多声明额外的方法, 简单. 但是如果当前页面有其他touch 监听, 容易混淆.
- 跟第一种区别其实不大, 而且API 也已经提供好, 只需要在不同状态下进行处理就可以了, 但是很容易与当前页面的其他手势冲突.
- 最精细的一种方法, 只会与按钮本身有交互, 不会涉及到其他控件. 但是需要监听6个按钮响应事件, 要实现6个额外的方法.比较麻烦.
获取录音的当前时间
设置 meteringEnabled 属性即可.
获取当前录音音量
recoder.updateMeters()
recorder.averagePowerForChannel //平均值
recorder.peakPowerForChannel //最大值
录音器的设定参数
recorderSettingDic =
[
AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: 2, //录音的声道数,立体声为双声道
AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue,
AVEncoderBitRateKey : 320000,
AVSampleRateKey : 44100.0 //录音器每秒采集的录音样本数
]
额外需要注意的部分
在dealloc 方法或者 deinit 方法中最好 recorder = nil
, player = nil
(如果有播放录音的话)