MIDIPianoRollView
一个可自定义的 UIScrollView 子类,用于在钢琴卷视图中渲染/编辑 MIDI 音符。
演示
要求
- iOS 9.0+
- Swift 4.2+
- Xcode 10.0+
用法
从 storyboard(UIScrollView 子类)或以编程方式创建 MIDIPianoRollView
。
MIDIPianoRollView.Keys
- 一个枚举,表示钢琴卷键的数据源。
- 可以是以下之一
- 一个如
30...50
的UInt8
MIDI 音符的范围(30号音符到50号音符) - 指定音阶范围内的音符
Scale
- 或自定义无序音高。
- 一个如
MIDIPianoRollView.Bars
- 表示钢琴卷帘音高上的小节数量的枚举。
- 可以是以下之一
- 由
.fixed(barCount)
确定的固定值 - 或
.auto
通过数据源自动计算小节数量。
- 由
MIDIPianoRollNote
- 通过设置
notes
数据源数组来弹出音符。 - 它是一个包含每个音符的起始位置、持续时间、MIDI音高和速度数据的
[MIDIPianoRollNote]
数组。
MIDIPianoRollPosition
- 这代表钢琴卷帘上音符的位置和持续时间值。包含
bar
、beat
、subbeat
和cent
值。 - 它们都是
Int
类型,符合Comparable
、Equatable
、Codable
以及自定义的+
和-
运算符。 - 每个
bar
根据钢琴卷帘的timesignature
包含若干个beat
。 - 每个
beat
有4个subbeat
。 - 每个
subbeat
有240个cent
进行微调。
MIDIPianoRollCellView
- 钢琴卷帘上的每个单元格都是
MIDIPianoRollCellView
的子类。 - 您可以通过继承它来基本创建自己的单元格视图。
MIDIPianoRollRowView
- 钢琴卷帘右侧的每个键视图是
MIDIPianoRollRowView
的子类。 - 您可以通过添加一些钢琴键图片来自定义子类并在钢琴卷帘上渲染。
MIDIPianoRollMeasureView
- 度量是一个自定义视图,包含多个
CALayer
,用于渲染位置文本和引导线。 - 您可以设置网格线宽度和颜色。
- 您可以设置度量位置标签字体和文字颜色。
- 如果您不想渲染度量,可以将
isMeasureEnabled
属性设置为false。
MIDIPianoRollView.ZoomLevel
- 缩放级别表示在钢琴卷上当前渲染的节拍值。
- 它具有可自定义的
minZoomLevel
和maxZoomLevel
范围。 - 每个缩放级别都有音符速率,例如,
.halfNotes
表示一节有2拍,有2个半音符,.quarterNotes
表示一节有4拍,有4个四分音符。
- 如果您将
isZoomingEnabled
设置为true,则可以在可自定义的minBeatWidth
和maxBeatWidth
值之间通过水平捏合来放大或缩小,以设置当前的beatWidth
。 beatWidth
达到限制时,根据缩放方向,缩放级别将前进到下一个级别。- 您可以设置
isZoomingEnabled
属性为false来禁用此行为。 - 相同的也是控制行高缩放。如果垂直捏合缩放,则当前的
rowHeight
将在minRowHeight
和maxRowHeight
属性之间缩放。
MIDIPianoRollView.GridLine
- 包含网格线样式的属性。
- 您可以设置每条线的宽度、颜色或虚线图案样式。
编辑
- 您可以通过将
isEditing
属性设置为true来进入单元格编辑模式。 - 在编辑模式下,您不能滚动视图,但可以平移单元格以移动或调整大小。
- 您可以通过设置
isMultipleEditingEnabled
属性为true来启用/禁用多选编辑。- 启用后,您可以通过拖动手指来渲染多选视图以选择拖动框下所有的单元格。
- 然后您可以移动或调整所选单元格的大小。
- 编辑完成后,钢琴卷会通知其代理。
MIDIPianoRollViewDelegate
- 当单元格被编辑时会通知代理。
- 您可以在代理调用中更新您的
notes
数据源。
func midiPianoRollView(_ midiPianoRollView: MIDIPianoRollView,
didMove cellView: MIDIPianoRollCellView,
to newPosition: MIDIPianoRollPosition,
pitch: UInt8)
- 会通知代理单元格已移动到新的位置和/或行。
- 您可以使用
pitch
值来判断单元格移动到了哪一行。
func midiPianoRollView(_ midiPianoRollView: MIDIPianoRollView,
didResize cellView: MIDIPianoRollCellView,
to newDuration: MIDIPianoRollPosition)
- 会通知代理单元格的时长已更改。
- 当单元格被调整大小时会调用。
func midiPianoRollViewMultipleEditingDraggingView(_ midiPianoRollView: MIDIPianoRollView) -> UIView?
- 如果您想渲染自定义拖选视图,请返回一个自定义的UIView。
示例项目
- 查看示例项目以获取更多实现信息。
文档
您可以在这里找到文档。