一个轻量级的迷你图组件,支持 Swift、SwiftUI、macCatalyst 和 Objective-C。
迷你图是一种非常小的图表,通常不绘制轴或坐标。 它以简单且高度浓缩的方式呈现某个测量值(通常是随时间变化)的一般变化形状,例如温度或股市价格。 迷你图足够小,可以嵌入到文本中,或者可以将多个迷你图组合在一起作为小倍数元素。 典型的图表旨在显示尽可能多的数据,并与文本流分开,而迷你图则旨在简洁、令人难忘,并位于讨论它们的位置。
DSFSparkline
不是设计成一个全功能的图形库。 它旨在轻量级,在应用程序中创建小型、令人难忘的图表。
如果您需要诸如标签、实时更新、轴标签、交互性、图例或更大尺寸的美观图表等功能,您可能更适合使用 Charts 库、Core plot 或 SciChart (付费)。 您可以在这里找到更多。
IBDesignable
支持预构建类型,因此您可以在 Interface Builder 中查看和配置您的迷你图。// A datasource with a simple set of data
let source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let stack = DSFSparklineOverlay.Line() // Create a line overlay
stack.dataSource = source // Assign the datasource to the overlay
bitmap.addOverlay(stack) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)
// Embed a sparkline in an NSAttributedString
let attributedString = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)
fileprivate let SwiftUIDemoDataSource: DSFSparkline.DataSource = {
let d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)
d.push(values: [
0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,
0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50
])
return d
}()
struct SuperCoolLineSpark: View {
// The overlay representing the zero-line for the data source
var zeroOverlay: DSFSparklineOverlay = {
let zeroLine = DSFSparklineOverlay.ZeroLine()
zeroLine.dataSource = SwiftUIDemoDataSource
zeroLine.dashStyle = []
return zeroLine
}()
// The overlay to draw a highlight between range 0 ..< 0.2
var rangeOverlay: DSFSparklineOverlay = {
let highlight = DSFSparklineOverlay.RangeHighlight()
highlight.dataSource = SwiftUIDemoDataSource
highlight.highlightRange = 0.0 ..< 0.2
highlight.fill = DSFSparkline.Fill.Color(DSFColor.gray.withAlphaComponent(0.4).cgColor)
return highlight
}()
// The actual line graph
var lineOverlay: DSFSparklineOverlay = {
let lineOverlay = DSFSparklineOverlay.Line()
lineOverlay.dataSource = SwiftUIDemoDataSource
lineOverlay.primaryStrokeColor = DSFColor.systemBlue.cgColor
lineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemBlue.withAlphaComponent(0.3).cgColor)
lineOverlay.secondaryStrokeColor = DSFColor.systemYellow.cgColor
lineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemYellow.withAlphaComponent(0.3).cgColor)
lineOverlay.strokeWidth = 1
lineOverlay.markerSize = 4
lineOverlay.centeredAtZeroLine = true
return lineOverlay
}()
var body: some View {
DSFSparklineSurface.SwiftUI([
rangeOverlay, // range highlight overlay
zeroOverlay, // zero-line overlay
lineOverlay, // line graph overlay
])
.frame(width: 150, height: 40)
}
}
一个简单的折线迷你图。 可以将折线居中于零线,以指示正值和负值。 您还可以将(可选)标记添加到数据点。
您可以通过提供绘图回调块 (markerDrawingBlock
) 来自定义绘制标记,您可以在其中自定义绘制哪些标记(例如,仅最小值和最大值)以及如何绘制它们。
标准 | 居中 |
---|---|
![]() |
![]() |
插值 | 插值居中 |
---|---|
![]() |
![]() |
标准标记 | 插值标记 |
---|---|
![]() |
![]() |
自定义标记(仅最小值/最大值) | 自定义标记(最近 5 个值) |
---|---|
![]() |
![]() |
//
// A custom marker drawing function that draws the maximum value in green, the minimum value in red
//
self.myLineView.markerDrawingBlock = { context, markerFrames in
// Get the frames containing the minimum and maximum values
if let minMarker = markerFrames.min(by: { (a, b) -> Bool in a.value < b.value }),
let maxMarker = markerFrames.min(by: { (a, b) -> Bool in a.value > b.value }) {
// Draw minimum marker
context.setFillColor(DSFColor.systemRed.cgColor)
context.fill(minMarker.rect)
context.setLineWidth(0.5)
context.setStrokeColor(DSFColor.white.cgColor)
context.stroke(minMarker.rect)
// Draw maximum marker
context.setFillColor(DSFColor.systemGreen.cgColor)
context.fill(maxMarker.rect)
context.setLineWidth(0.5)
context.setStrokeColor(DSFColor.white.cgColor)
context.stroke(maxMarker.rect)
}
}
一个简单的条形图迷你图。 可以将条形居中于零线,以指示正值和负值。
标准 | 居中 |
---|---|
![]() |
![]() |
堆叠线迷你图与条形图类似,只是它不分离出单独的列。 堆叠线可以居中于零线,以指示正值和负值。
标准 | 居中 |
---|---|
![]() |
![]() |
条纹图。 条纹图的一个很好的例子是“变暖条纹”气候图。
来自数据源的值被映射到提供的渐变
标准 | 整数(像素边界) |
---|---|
![]() |
![]() |
类似于 Activity Viewer 的 CPU 历史记录图的点迷你图
标准 | 反转 |
---|---|
![]() |
![]() |
胜负图,其中数据源中的正值表示为“胜”,负值表示为“负”,零值表示为“平”。
胜/负 | 胜/负/平 |
---|---|
![]() |
![]() |
平板图,其中数据源中的正值表示为填充圆圈,负值表示为空心圆圈。 该行为与胜负图相同。
标准 |
---|
![]() |
一个基本的饼图迷你图
标准 |
---|
![]() |
数据条迷你图。 支持百分比和总计类型。
百分比 | 总计 |
---|---|
![]() |
![]() |
百分比条迷你图接受单个值 (0 ... 1),并绘制一个包含该值的水平条形图,带有可选的文本标签。
![]() |
![]() |
一个带有单个值 (0 ... 1) 的简单量表。 量表中显示的颜色可以是以下之一
标准 |
---|
![]() |
Github 风格的活动网格。 每个单元格代表一个渐进中的离散值,带有颜色
![]() |
![]() |
圆形进度图
模拟健康环 |
---|
![]() ![]() ![]() ![]() |
圆形量表
![]() |
![]() |
![]() |
![]() |
您可以在 Demos/Samples
子文件夹中的项目中找到许多迷你图示例,提供 macOS(swift 和 objc)、iO、tvOS、macCatalyst 和 SwiftUI 的示例。
在 Demos/Playground
子文件夹中还有一个简单的 Xcode Playground,您可以在其中使用不同的迷你图类型
预构建的视图对于使用 SwiftUI 或通过 Interface Builder 快速添加迷你图非常有用。 这些视图的样式和自定义设置略有限制,但比直接使用覆盖层实现起来要快得多。
在大多数情况下,预构建的类型将满足您的所有需求。
如果您在 v4 之前使用过 DSFSparklines
,这些是您过去用于显示迷你图的原始视图类型。
覆盖迷你图有三个基本的构建块。 与预构建的视图相比,覆盖迷你图更加灵活和可配置,但设置起来更复杂。
表面代表迷你图的目标。 该库提供了许多内置表面
DSFSparklineSurfaceView
- 用于显示迷你图的 NSView
/UIView
表面DSFSparklineSurface.SwiftUI
- 一个 SwiftUI View
表面。DSFSparklineSurface.Bitmap
- 用于从迷你图创建位图的 NSImage
/UIImage
/CGImage
/NSAttributedString
表面。数据源为迷你图提供数据。 数据源可以在多个覆盖层或预构建类型(见下文)之间共享,以提供数据源中包含的数据的不同“视图”。 并且如果更新了 DataSource
,所有观察该数据源的迷你图覆盖层都将自动重新渲染。
目前有两种类型的数据源可用
一个 DataSource,其中包含可以通过将新值推送到源来更新的值。
DataSource 定义了一个“windowSize”——要在覆盖层上绘制的最大值数量。当值被推送到 DataSource 中时,任何不再fit
在 DataSource 窗口中的值都将被丢弃。
/// Swift
dataSource.windowSize = 30
assert(dataSource.windowSize == 30)
/// Objective-C
[dataSource setWindowSize:30];
assert([dataSource windowSize] == 30);
范围定义了要在微型图 (sparkline) 中显示的上限值和下限值。 推送到数据源中的任何值在绘制到该范围时都将被限制在此范围内。
如果未设置范围(即 nil),则任何覆盖图都将自动调整大小以适应源中的整个值范围。 例如,如果值为 [1, 2, 3, 4],则范围隐式设置为 1 ... 4。 如果值为 [-10, 100, 33],则范围隐式设置为 -10 ... 100。
/// Swift
dataSource.range = -1.0 ... 1.0
/// Objective-C
[dataSource setRangeWithLowerBound:-1.0 upperBound:1.0];
零线定义了微型图覆盖图应视为“零”的点。 例如,可以居中的图形(线形图、条形图和堆叠线形图)使用零线值来定义图形居中位置。
零线值默认为零。
您可以通过向您的表面添加一个DSFSparklineOverlay.ZeroLine
来绘制微型图的零线。
/// Swift
dataSource.zeroLineValue = 0.2
/// Objective-C
[dataSource setZeroLineValue:0.2];
您可以使用push
函数将新值推送到数据源中。 数据源中早于数据源的windowSize
的值将被丢弃。
当值被推送到数据源中时,分配给该数据源的任何覆盖图都将自动更新。
/// Swift
dataSource.push(value: 4.5)
dataSource.push(values: [6, 7, 8])
/// Objective-C
[dataSource pushWithValue:@(4.5)];
您可以使用set
函数替换数据源中的所有值。 set 函数还会将数据源的windowSize
更改为传入的值数组的大小。
分配给该数据源的任何覆盖图都将自动更新。
/// Swift
datasource.set(values: [
0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
0.0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0
])
/// Objective-C
[datasource setWithValues:
@[@(0.0), @(0.1), @(0.2), @(0.3), @(0.4), @(0.5), @(0.6), @(0.7), @(0.8), @(0.9), @(1),
@(0.0), @(-0.1), @(-0.2), @(-0.3), @(-0.4), @(-0.5), @(-0.6), @(-0.7), @(-0.8), @(-0.9), @(-1)]];
一个包含静态值集的数据源。 某些类型的微型图使用单个“set”数据,不提供历史上下文。
/// Swift
let dataSource = DSFSparkline.StaticDataSource([1, 2, 3])
/// Objective-C
DSFSparklineStaticDataSource* dataSource = [[DSFSparklineStaticDataSource alloc] init: @[@(1), @(2), @(3)]];
覆盖图代表微型图的各个可视组件。 您可以按任意顺序向您的表面添加任意数量的覆盖图。 例如,您可以使用相同的数据源将两种不同的图形类型叠加到同一表面上。 并且由于覆盖图可以共享它们的数据源,因此如果数据发生更改(例如,响应push
),所有使用相同源的覆盖图都将自动更新。
例如,有一个覆盖图突出显示数据的 y 轴范围。 或者,如果您想要一些网格线,您可以使用网格线覆盖图添加它们。
您可以将覆盖图的不同实例添加到同一个微型图。 例如,如果您想要添加多个范围高亮,您可以将多个“高亮”覆盖图添加到微型图表面。
添加覆盖图的顺序决定了它们在微型图中的 z 轴顺序。 例如,如果您想将网格绘制在图形的顶部,您可以在添加网格覆盖图之前添加图形覆盖图。
覆盖图使您的微型图可以根据需要变得复杂或简单。
当值被“推送”到其数据源上时,动态图形会自动更新其覆盖图。 添加数据后,分配的覆盖图会自动更新以反映新数据。 如果通过 push 或 set 添加了更多数据,则数据将被添加到数据源,关联的视图将自动更新以反映新数据。 不再属于数据源窗口范围内的旧数据将被丢弃。
这提供了在图形的广度上显示历史数据集的能力。
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let line = DSFSparklineOverlay.Line() // Create a line overlay
line.strokeWidth = 1
line.primaryFill = primaryFill
line.dataSource = source // Assign the datasource to the overlay
bitmap.addOverlay(line) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let stack = DSFSparklineOverlay.Stackline() // Create a stackline overlay
stack.dataSource = source // Assign the datasource to the overlay
stack.strokeWidth = 1
stack.primaryFill = primaryFill
bitmap.addOverlay(stack) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let bar = DSFSparklineOverlay.Bar() // Create a bar overlay
bar.dataSource = source // Assign the datasource to the overlay
bar.primaryFill = primaryFill
bitmap.addOverlay(bar) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let dot = DSFSparklineOverlay.Dot() // Create a dot graph overlay
dot = biggersource // Assign the datasource to the overlay
bitmap.addOverlay(dot) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 32, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let winLossTie = DSFSparklineOverlay.WinLossTie() // Create a win-loss-tie overlay
winLossTie.dataSource = winloss // Assign the datasource
bitmap.addOverlay(winLossTie) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 75, height: 12, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let stack = DSFSparklineOverlay.Tablet() // Create a tablet overlay
stack.dataSource = winloss // Assign a datasource to the overlay
bitmap.addOverlay(stack) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 90, height: 16, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap() // Create a bitmap surface
let stack = DSFSparklineOverlay.Stripes() // Create a stripes overlay
stack.dataSource = .init(values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
bitmap.addOverlay(stack) // And add the overlay to the surface.
// Generate an image with retina scale
let image = bitmap.image(width: 90, height: 16, scale: 2)
// Do something with 'image'
静态图形具有固定的值集(例如,饼图)。 当将新的静态数据源分配给它时,覆盖图会更新。
let bitmap = DSFSparklineSurface.Bitmap()
let pie = DSFSparklineOverlay.Pie()
pie.dataSource = DSFSparkline.StaticDataSource([10, 55, 20])
pie.lineWidth = 0.5
pie.strokeColor = CGColor.black
bitmap.addOverlay(pie)
// Generate an image with retina scale
let image = bitmap.image(width: 18, height: 18, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap()
let stack = DSFSparklineOverlay.DataBar()
stack.dataSource = DSFSparkline.StaticDataSource([10, 20, 30])
stack.lineWidth = 0.5
stack.strokeColor = CGColor.black
bitmap.addOverlay(stack)
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 18, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap()
let percentBar = DSFSparklineOverlay.PercentBar(value: 0.3)
bitmap.addOverlay(percentBar)
// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 18, scale: 2)!
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap()
let wiperGauge = DSFSparklineOverlay.WiperGauge()
wiperGauge.value = 0.75
bitmap.addOverlay(wiperGauge)
// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap()
let activityGrid = DSFSparklineOverlay.ActivityGrid()
activityGrid.dataSource = DSFSparkline.StaticDataSource(values: [...])
activityGrid.verticalCellCount = 1
bitmap.addOverlay(activityGrid)
// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 200, height: 14, scale: 2)
// Do something with 'image'
let bitmap = DSFSparklineSurface.Bitmap()
let gauge = DSFSparklineOverlay.CircularGauge()
gauge.value = 0.66
bitmap.addOverlay(gauge)
// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 40, height: 40, scale: 2)
// Do something with 'image'
组件表示本身不是图形的覆盖图。 示例包括网格线、零线、高亮等。 组件使用相同的数据源,以便与其关联的图形对齐。
名称 (Name) | 描述 (Description) |
---|---|
DSFSparklineOverlay.ZeroLine |
在微型图的“零线”位置绘制一条水平线。 零线由数据源定义,默认情况下为零,但可以更改。 |
DSFSparklineOverlay.RangeHighlight |
突出显示微型图上的一系列 y 轴值 |
DSFSparklineOverlay.GridLines |
在微型图上指定的 y 轴值处绘制线条 |
DSFSparkline 提供了许多“预构建”的微型图视图,范围更有限,旨在更快地添加到您的项目中。
每个预构建的微型图视图都有一个 SwiftUI 配套视图。
DSFSparklineLineGraphView
/ DSFSparklineLineGraphView.SwiftUI
DSFSparklineStackLineGraphView
/ DSFSparklineLineGraphView.SwiftUI
DSFSparklineBarGraphView
/ DSFSparklineBarGraphView.SwiftUI
DSFSparklineStripesGraphView
/ DSFSparklineStripesGraphView.SwiftUI
DSFSparklineDotGraphView
/ DSFSparklineDotGraphView.SwiftUI
DSFSparklineWinLossGraphView
/ DSFSparklineWinLossGraphView.SwiftUI
DSFSparklineTabletGraphView
/ DSFSparklineTabletGraphView.SwiftUI
DSFSparklinePieGraphView
/ DSFSparklinePieGraphView.SwiftUI
DSFSparklineDataBarGraphView
/ DSFSparklineDataBarGraphView.SwiftUI
DSFSparklinePercentBarGraphView
/ DSFSparklinePercentBarGraphView.SwiftUI
DSFSparklineWiperGaugeGraphView
/ DSFSparklineWiperGaugeGraphView.SwiftUI
DSFSparklineActivityGridView
/ DSFSparklineActivityGridView.SwiftUI
DSFSparklineCircularGaugeView
/ DSFSparklineCircularGaugeView.SwiftUI
// Create the view
let sparklineView = DSFSparklineLineGraphView(…)
sparklineView.graphColor = UIColor.blue
sparklineView.showZeroLine = true
// Create the datasource and assign to the view
let sparklineDataSource = DSFSparklineDataSource(windowSize: 30, range: -1.0 ... 1.0)
sparklineView.dataSource = sparklineDataSource
…
// Add a single new data element to the sparkline
sparklineDataSource.push(value: 0.7) // view automatically updates with new data
// Add a set of data to the sparkline
sparklineDataSource.push(values: [0.3, -0.2, 1.0]) // view automatically updates with new data
// Completely replace the sparkline data with a new set of data
sparklineDataSource.set(values: [0.2, -0.2, 0.0, 0.9, 0.8]) // view automatically resets to new data
struct SparklineView: View {
let leftDataSource: DSFSparkline.DataSource
let rightDataSource: DSFSparkline.DataSource
let BigCyanZeroLine = DSFSparkline.ZeroLineDefinition(
color: .cyan,
lineWidth: 3,
lineDashStyle: [4,1,2,1]
)
var body: some View {
HStack {
DSFSparklineLineGraphView.SwiftUI(
dataSource: leftDataSource,
graphColor: DSFColor.red,
interpolated: true)
DSFSparklineBarGraphView.SwiftUI(
dataSource: rightDataSource,
graphColor: DSFColor.blue,
lineWidth: 2,
showZeroLine: true,
zeroLineDefinition: BigCyanZeroLine)
}
}
}
表示可查看的设置和显示。 当前可用的视图类型有:-
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
graphColor |
NSColor UIColor |
绘制微型图时要使用的颜色 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
showZeroLine |
Bool |
在 y 轴上的零线点处绘制虚线 |
zeroLineColor |
NSColor UIColor |
y 轴上“零线”的颜色。 |
zeroLineWidth |
CGFloat |
y 轴上“零线”的宽度 |
zeroLineDashStyle |
[CGFloat] |
绘制零线时要使用的短划线模式 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
centeredAtZeroLine |
Bool |
图形是否应在零线处居中? |
lowerGraphColor |
NSColor UIColor |
用于绘制零线下值的颜色。 如果为 nil,则与图形颜色相同 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
lineWidth |
CGFloat |
线的宽度 |
interpolation |
Bool |
在点之间插入曲线 |
lineShading |
Bool |
为线条下方的区域着色 |
shadowed |
Bool |
在线条下方绘制阴影 |
markerSize |
CGFloat |
(可选)使用该点的线条颜色,在图形中的每个数据点处绘制指定大小的标记 |
markerSize |
CGFloat |
(可选)使用该点的线条颜色,在图形中的每个数据点处绘制指定大小的标记 |
markerDrawingBlock |
允许自定义绘制标记的回调块(如果markerSize > 1) |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
lineWidth |
CGFloat |
线的宽度 |
barSpacing |
CGFloat |
每个柱状图之间的间距 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
integral |
Bool |
如果为 true,则在像素边界上绘制条纹,以获得漂亮的干净线条 |
gradient |
DSFGradient |
将数据源值映射到颜色时使用的颜色渐变。 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
upsideDown |
Bool |
如果为 true,则从图表的顶部向下绘制 |
unsetGraphColor |
NSColor UIColor |
绘制背景时使用的颜色 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
lineWidth |
CGFloat |
描边的线宽 |
barSpacing |
CGFloat |
每个柱状图之间的间距 |
winColor |
NSColor UIColor |
用于“赢”的颜色 |
lossColor |
NSColor UIColor |
用于“亏”的颜色 |
tieColor |
NSColor UIColor |
(可选) 用于“平局”的颜色。如果为 nil,则不绘制平局 (0) 值 默认情况下,不绘制“平局”值。 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
DSFDataSource |
图形的数据源 |
lineWidth |
CGFloat |
描边的线宽 |
barSpacing |
CGFloat |
每个柱状图之间的间距 |
winColor |
NSColor UIColor |
绘制“赢”的填充圆的颜色 |
lossColor |
NSColor UIColor |
绘制“亏”的填充圆的颜色 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
[CGFloat] |
饼图中要显示的数据 |
palette |
DSFSparklinePalette |
绘制图表时使用的调色板 |
strokeColor |
NSColor UIColor |
(可选) 在每个分段之间绘制的线条颜色。 如果为 nil,则不绘制线条 |
lineWidth |
CGFloat |
在每个分段之间绘制的线条宽度 |
animated |
Bool |
如果为 true,则在设置数据源时,各个段会动画进入视图 |
animationDuration |
CGFloat |
动画的持续时间 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
dataSource |
[CGFloat] |
饼图中要显示的数据 |
maximumTotalValue |
CGFloat |
如果 <= 0,则数据表示总数的百分比;如果 > 0,则表示数据条最右边的值 |
palette |
DSFSparklinePalette |
绘制时使用的调色板。 |
strokeColor |
NSColor UIColor |
(可选) 在每个分段之间绘制的线条颜色。 如果为 nil,则不绘制线条 |
lineWidth |
CGFloat |
在每个分段之间绘制的线条宽度 |
unsetColor |
NSColor UIColor |
(可选) 如果设置了最大值,并且各个段不适合总数,则此颜色用作背景颜色 |
animated |
Bool |
如果为 true,则在设置数据源时,各个段会动画进入视图 |
animationDuration |
CGFloat |
动画的持续时间 |
设置 (Setting) | 类型 (Type) | 描述 (Description) |
---|---|---|
value |
CGFloat |
饼图中要显示的值 |
displayStyle |
Style |
绘制图表时应用的样式 |
cornerRadius |
CGFloat |
条形的圆角半径。 |
showLabel |
Bool |
我们是否应该在百分比条形图上绘制文本标签? |
underBarColor |
NSColor UIColor |
百分比条形图的条形背景颜色 |
underBarTextColor |
NSColor UIColor |
在背景上显示的文本颜色 |
barColor |
NSColor UIColor |
百分比条形图的条形颜色 |
barTextColor |
NSColor UIColor |
在条形上显示的文本颜色 |
fontName |
String |
标签字体的名称 |
fontSize |
CGFloat |
标签字体的大小 |
shouldAnimate |
Bool |
如果为 true,则在设置数据源时,各个段会动画进入视图 |
animationDuration |
CGFloat |
动画的持续时间 |
leftInset . |
CGFloat |
条形从控件左侧的缩进 |
topInset |
CGFloat |
条形从控件顶部的缩进 |
rightInset |
CGFloat |
条形从控件右侧的缩进 |
bottomInset |
CGFloat |
条形从控件底部的缩进 |
在 Demos
子文件夹中提供了针对每个支持平台的演示。 演示使用 CocoaPods,因此您需要在 Demos 文件夹中执行 pod install
。
pod 'DSFSparkline', :git => 'https://github.com/dagronf/DSFSparkline/'
将 https://github.com/dagronf/DSFSparkline
添加到您的项目。
macOS 暗黑 | macOS 浅色 | iOS |
---|---|---|
![]() |
![]() |
![]() |
macOS | tvOS |
---|---|
![]() |
![]() |
@IBDesignable
和 @IBInspectable
的支持,因为 Xcode 已表明它将在不久的将来放弃支持对绘图代码进行了大量的重新架构(以前直接在视图中),将其分为覆盖层和表面,这些覆盖层和表面更加灵活(例如,能够绘制迷你图位图而无需创建视图)
以前的 view/swiftui 类型仍然可用 - 它们已使用新的覆盖方案重建,并在文档中称为“预构建”类型。 这允许与以前版本的库向后兼容。 但请注意,鉴于预构建视图已被重写,因此可能会出现细微的视觉差异。
snapshot
方法添加到基本迷你图视图类,以生成 NSImage/UIImage 版本的迷你图,用于文本等中的嵌入式迷你图。DSFSparklineZeroLineDefinition
。showZero
更改为 showZeroLine
,以与新的零线显示值保持一致您可以通过数据源上的 zeroLineValue
设置绘制“零”线的位置。
主要视图已重命名,并添加了 View
后缀。 所以
DSFSparklineLineGraph
-> DSFSparklineLineGraphView
DSFSparklineBarGraph
-> DSFSparklineBarGraphView
DSFSparklineDotGraph
-> DSFSparklineDotGraphView
为了模块命名一致性,将 SLColor
和 SLView
重命名为 DSFColor
和 DSFView
。
我从核心 DSFSparklineDataSourceView
中删除了 windowSize
。 windowSize
与数据相关,不应成为 UI 定义的一部分。 我专门为 IBDesignable
支持提供了一个替代方案,称为 graphWindowSize
,它应该仅从 Interface Builder 调用。 如果你想从你的 xib 文件中设置 windowSize,设置 graphWindowSize
inspectable。
如果您在日志中看到类似 2020-12-07 18:22:51.619867+1100 iOS Sparkline Demo[75174:1459637] Failed to set (windowSize) user defined inspected property on (DSFSparkline.DSFSparklineBarGraphView): [<DSFSparkline.DSFSparklineBarGraphView 0x7fe2eb10f2b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key windowSize.
的警告,这意味着您在 .xib 文件中设置了 windowSize
值。 删除它并设置 graphWindowSize
值。
对于 Bar 类型,lineWidth
和 barSpacing
现在表示条形之间的像素间距和线条的像素宽度。 如果您过去为这些设置了小数值(例如,如果您设置 lineWidth = 0.5),您可能会发现您的行距和条形间距现在不正确。 这种变化的原因是为了帮助在像素边界上绘制线条并避免抗锯齿。
修复了零线上下颠倒的问题
麻省理工学院。 随心所欲地使用它,只需注明我的作品即可。 如果您在某个地方使用它,请告诉我,我很乐意听到它!
MIT License
Copyright (c) 2023 Darren Ford
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.