起因是,最近重新练起小提琴,缺一个节拍器,懒得叫家里寄过来,也不想重新买一个占位置。在 App Store 看了一圈没有心水的,想着功能应该也挺简单,决定自己学着做一个。作文以记之。
节拍器可以规律地发出声音,用来提供一个稳定的节拍和速度参考;拖动杠杆中间的滑块,可以将速度设置为每分钟几拍。那么简单分析,基本是这三个功能:
- 有一个 slider,可以调节数值;
- 播放指定音频;
- 让音频根据数值频率的反复播放。
然后打开 Xcode,新建一个 Swift 的 Single View Application 项目。
1. Slider
首先是 Slider,打开 Main.storyboard,在右下角控件库拖一个 Slider 和 Label 到 View Controller 里面(Label 用来显示数值,可以输个默认值 120)。一般的调音器是每分钟 40~208 拍,因此找到右上角的参数,填入 Value、Minimum 和 Maximum。
接着是让 Slider 和 Label 跟代码连接起来。这时我喜欢打开双屏(Assistant editor,右上角两个圈 icon 的按钮),左边显示 storyboard 右边显示 ViewController.swift 文件。
选中 Slider,按住 control 键把 Slider 拖到代码文件里。选择默认的Outlet
就好,Label 也一样,命名随意比如可以叫speed
、speedLabel
。
这就定义好这两个控件,顺利的话会自动出现下面的代码:
@IBOutlet weak var speed: UISlider!
@IBOutlet weak var speedLabel: UILabel!
接着,我先需要一个描述速度的东西,而且它初始值是 120(不太懂):
var selectedSpeed: Float = 120.0
然后是建立滑动这个功能,用刚才一样的方法再拖一次 Slider 到代码里,但这次不是选Outlet
而是Action
,取名比如叫sliderChanged
,sender 选 UISlider
自己。这个功能里,我们需要让刚刚定义出来的selectedSpeed
被 sender 赋值,需要让speedLabel
的文本变成它的值。得出:
@IBAction func sliderChanged(_ sender: UISlider) {
selectedSpeed = sender.value
speedLabel.text = String(format: "%.0f", Double(selectedSpeed))
}
format: "%.0f"
用来控制数值数位,Double
是种数字的类型(依然不懂)。
这时可以随便选个虚拟设备尝试运行一下,检查代码有没有问题,如果顺利,Label 的数值就会随着 Slider 的拖动而变化啦。
Label 在变化的时候如果出现「…」,就是 Label 宽度不够导致文本显示不全,拉宽一点就好,等后面设计出来后再调。
下一篇,把功能都实现出来。