ios Swift Chart条形图堆叠时标记条形图

ndasle7k  于 2023-05-23  发布在  iOS
关注(0)|答案(1)|浏览(169)

Swift Charts BarMark bar shape when stacked相关
我试图在一个带有堆叠值的BarMark上应用剪辑形状,结果是它应用的形状为每个堆叠项,而不是整个条。
我想实现的目标:

我得到了什么:

我注意到角半径应用于整个酒吧,但仅应用于酒吧的顶部:

有没有办法在堆叠时得到这个胶囊形状?我的代码是:

enum Value: Int, Hashable, CaseIterable {
    case ftb
    case nb
    case remaining

    var color: Color {
        switch self {
        case .ftb:
            return .tint1
        case .nb:
            return .tint2
        case .ramaining:
            return .gray4
        }
    }
}

@ViewBuilder var barChart: some View {
        Chart {
            ForEach(dates, id: \.self) { date in
                let incomeSummary = incomeSummaries.first(where: { $0.date?.inSameDay(as: date) == true })

                ForEach(Value.allCases, id: \.self) { value in
                    barMark(for: value, date: date, incomeSummary: incomeSummary)
                        .foregroundStyle(value.color)
                }
//                .cornerRadius(20, style: .continuous)
//                .clipShape(Capsule())
            }
        }

        .chartXAxis {
            AxisMarks(values: dates) { date in
                AxisValueLabel(format: .dateTime.weekday(), centered: true)
            }
        }
        .chartYAxis {
            AxisMarks { mark in
                AxisValueLabel()
            }
        }
    }

private func barMark(for value: Value, date: Date, incomeSummary: IncomeSummary?) -> BarMark {
        let amount = amount(for: value, in: incomeSummary)

        return BarMark(x: .value("WeekDay",
                                  date, 
                                  unit: .day,
                                  calendar: Calendar.localTime),
                        y: .value("Income", amount))
    }

另一个问题:我注意到,当AxisValueLabel居中时,最后一个条形图会丢失它的标签。是虫子吗?

vm0i2vca

vm0i2vca1#

我会尝试以下…

Chart(array) { model in
    BarMark
    ...
        .foregroundStyle(by: .value("Label", widget.label))
        .clipShape(
            array.last == model 
                ? RoundedCorners([.topLeft, .topRight])
                : Rectangle()
        )

但是由于SwiftUI不支持圆化特定的角,RoundedCorners需要是一个虚构的视图。

struct RoundedCorners: Shape {
    enum CornersToRound { ... }
    func path(in rect: CGRect) -> Path { ... }
}

相关问题