Compare commits

...

8 Commits

Author SHA1 Message Date
Cljak10 9115a992c9 Add legend format specifier option in LineView (#186)
Co-authored-by: ClaesCJ <claes@airwallet.net>
2021-03-26 19:36:05 +01:00
Will Dale eca6eda179 Bugfix: Line height in LineView (#175)
* Make the line reach the top and bottom of the chart.

* Put the Magnifier's bottom edge on the 0 line.
2021-03-26 19:32:04 +01:00
Mike Koene 1f4949a731 Bugfix: Draw Lines (#173)
Remove .drawingGroup() to draw Lines again.
2021-03-26 19:31:20 +01:00
Fumiya Tanaka 92490983c5 [WIP]Add an option to animate to back position (BarChart). (#171)
* add `keepTouchLocation` to let us choose whether touchLocation is back to -1 after label has been dragged.

* keep showing value if `keepTouchLocation` is true.

* Update README.md

* feat: when `keepTouchLocation` is true,  bar is automatically deselect in a second after a gesture.

* fix: (BarChart) add animation when back to initial position after completing your gesture. and rename keepTouchLocation to animatedToBack.
2021-03-26 19:30:51 +01:00
Andras Samu 5c49a55e68 fix(LineChartView): fixed linechart shifting down 2021-03-26 19:22:18 +01:00
josephwalden13 29700ffd47 made cornerImage optional (#76) 2021-03-26 18:56:51 +01:00
willtemperley 5aa8cdf50b macOS support: v11 only. Swift tools bumped to 5.3 (#183) 2021-03-24 15:31:12 +01:00
Andras Samu 08f0053b16 update slack link 2020-09-23 14:20:22 +02:00
10 changed files with 43 additions and 18 deletions
+1
View File
@@ -2,3 +2,4 @@
/.build
/Packages
/*.xcodeproj
.swiftpm
+2 -2
View File
@@ -1,4 +1,4 @@
// swift-tools-version:5.1
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
@@ -6,7 +6,7 @@ import PackageDescription
let package = Package(
name: "SwiftUICharts",
platforms: [
.iOS(.v13), .watchOS(.v6), .macOS(.v10_15)
.iOS(.v13), .watchOS(.v6), .macOS(.v11)
],
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
+5 -1
View File
@@ -20,7 +20,7 @@ It supports:
### Slack
Join our Slack channel for day to day conversation and more insights:
[Slack invite link](https://join.slack.com/t/swiftuichartview/shared_invite/zt-el5pnmba-FvyraEsI~EwxqWHNfHZWZg)
[Slack invite link](https://join.slack.com/t/swiftuichartview/shared_invite/zt-g6mxioq8-j3iUTF1YKX7D23ML3qcc4g)
### Installation:
@@ -188,6 +188,10 @@ You can access built-in styles:
BarChartView(data: [8,23,54,32,12,37,7,23,43], title: "Title", form: ChartForm.small)
```
### You can choose whether bar is animated or not after completing your gesture.
If you want to animate back movement after completing your gesture, you set `animatedToBack` as `true`.
### WatchOS support for Bar charts:
![Pie Charts](./Resources/watchos1.png "Pie Charts")
@@ -17,8 +17,9 @@ public struct BarChartView : View {
public var darkModeStyle: ChartStyle
public var formSize:CGSize
public var dropShadow: Bool
public var cornerImage: Image
public var cornerImage: Image?
public var valueSpecifier:String
public var animatedToBack: Bool
@State private var touchLocation: CGFloat = -1.0
@State private var showValue: Bool = false
@@ -33,7 +34,7 @@ public struct BarChartView : View {
var isFullWidth:Bool {
return self.formSize == ChartForm.large
}
public init(data:ChartData, title: String, legend: String? = nil, style: ChartStyle = Styles.barChartStyleOrangeLight, form: CGSize? = ChartForm.medium, dropShadow: Bool? = true, cornerImage:Image? = Image(systemName: "waveform.path.ecg"), valueSpecifier: String? = "%.1f"){
public init(data:ChartData, title: String, legend: String? = nil, style: ChartStyle = Styles.barChartStyleOrangeLight, form: CGSize? = ChartForm.medium, dropShadow: Bool? = true, cornerImage:Image? = Image(systemName: "waveform.path.ecg"), valueSpecifier: String? = "%.1f", animatedToBack: Bool = false){
self.data = data
self.title = title
self.legend = legend
@@ -41,8 +42,9 @@ public struct BarChartView : View {
self.darkModeStyle = style.darkModeStyle != nil ? style.darkModeStyle! : Styles.barChartStyleOrangeDark
self.formSize = form!
self.dropShadow = dropShadow!
self.cornerImage = cornerImage!
self.cornerImage = cornerImage
self.valueSpecifier = valueSpecifier!
self.animatedToBack = animatedToBack
}
public var body: some View {
@@ -105,9 +107,19 @@ public struct BarChartView : View {
}
})
.onEnded({ value in
self.showValue = false
self.showLabelValue = false
self.touchLocation = -1
if animatedToBack {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
withAnimation(Animation.easeOut(duration: 1)) {
self.showValue = false
self.showLabelValue = false
self.touchLocation = -1
}
}
} else {
self.showValue = false
self.showLabelValue = false
self.touchLocation = -1
}
})
)
.gesture(TapGesture()
+5 -1
View File
@@ -268,11 +268,15 @@ class HapticFeedback {
static func playSelection() -> Void {
WKInterfaceDevice.current().play(.click)
}
#else
#elseif os(iOS)
//iOS implementation
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
static func playSelection() -> Void {
UISelectionFeedbackGenerator().selectionChanged()
}
#else
static func playSelection() -> Void {
//No-op
}
#endif
}
+2 -1
View File
@@ -13,6 +13,7 @@ struct Legend: View {
@Binding var frame: CGRect
@Binding var hideHorizontalLines: Bool
@Environment(\.colorScheme) var colorScheme: ColorScheme
var specifier: String = "%.2f"
let padding:CGFloat = 3
var stepWidth: CGFloat {
@@ -42,7 +43,7 @@ struct Legend: View {
ZStack(alignment: .topLeading){
ForEach((0...4), id: \.self) { height in
HStack(alignment: .center){
Text("\(self.getYLegendSafe(height: height), specifier: "%.2f")").offset(x: 0, y: self.getYposition(height: height) )
Text("\(self.getYLegendSafe(height: height), specifier: specifier)").offset(x: 0, y: self.getYposition(height: height) )
.foregroundColor(Colors.LegendText)
.font(.caption)
self.line(atHeight: self.getYLegendSafe(height: height), width: self.frame.width)
@@ -80,7 +80,6 @@ public struct Line: View {
.onDisappear {
self.showFull = false
}
.drawingGroup()
if(self.showIndicator) {
IndicatorPoint()
.position(self.getClosestPointOnPath(touchLocation: self.touchLocation))
@@ -108,7 +108,7 @@ public struct LineChartView: View {
maxDataValue: .constant(nil)
)
}
.frame(width: frame.width, height: frame.height + 30)
.frame(width: frame.width, height: frame.height)
.clipShape(RoundedRectangle(cornerRadius: 20))
.offset(x: 0, y: 0)
}.frame(width: self.formSize.width, height: self.formSize.height)
@@ -14,7 +14,8 @@ public struct LineView: View {
public var legend: String?
public var style: ChartStyle
public var darkModeStyle: ChartStyle
public var valueSpecifier:String
public var valueSpecifier: String
public var legendSpecifier: String
@Environment(\.colorScheme) var colorScheme: ColorScheme
@State private var showLegend = false
@@ -29,13 +30,15 @@ public struct LineView: View {
title: String? = nil,
legend: String? = nil,
style: ChartStyle = Styles.lineChartStyleOne,
valueSpecifier: String? = "%.1f") {
valueSpecifier: String? = "%.1f",
legendSpecifier: String? = "%.2f") {
self.data = ChartData(points: data)
self.title = title
self.legend = legend
self.style = style
self.valueSpecifier = valueSpecifier!
self.legendSpecifier = legendSpecifier!
self.darkModeStyle = style.darkModeStyle != nil ? style.darkModeStyle! : Styles.lineViewDarkMode
}
@@ -60,12 +63,12 @@ public struct LineView: View {
.foregroundColor(self.colorScheme == .dark ? self.darkModeStyle.backgroundColor : self.style.backgroundColor)
if(self.showLegend){
Legend(data: self.data,
frame: .constant(reader.frame(in: .local)), hideHorizontalLines: self.$hideHorizontalLines)
frame: .constant(reader.frame(in: .local)), hideHorizontalLines: self.$hideHorizontalLines, specifier: legendSpecifier)
.transition(.opacity)
.animation(Animation.easeOut(duration: 1).delay(1))
}
Line(data: self.data,
frame: .constant(CGRect(x: 0, y: 0, width: reader.frame(in: .local).width - 30, height: reader.frame(in: .local).height)),
frame: .constant(CGRect(x: 0, y: 0, width: reader.frame(in: .local).width - 30, height: reader.frame(in: .local).height + 25)),
touchLocation: self.$indicatorLocation,
showIndicator: self.$hideHorizontalLines,
minDataValue: .constant(nil),
@@ -73,7 +76,7 @@ public struct LineView: View {
showBackground: false,
gradient: self.style.gradientColor
)
.offset(x: 30, y: -20)
.offset(x: 30, y: 0)
.onAppear(){
self.showLegend = true
}
@@ -29,5 +29,6 @@ public struct MagnifierRect: View {
.blendMode(.multiply)
}
}
.offset(x: 0, y: -15)
}
}