首页 > 解决方案 > 如何在点击时更改形状颜色

问题描述

我想实现逻辑来改变点击时的形状颜色。我尝试修改示例以更改点击时的形状,如下所示:

import SwiftUI

struct PathView: View {
    @State private var insetAmount: CGFloat = 50
    @State private var fillColor: UIColor = UIColor.white
    var body: some View {
        GeometryReader {
            geometry in
            ZStack {
                Trapezoid(insetAmount: insetAmount, fillColor: fillColor)
                            .frame(width: 200, height: 100)
                            .onTapGesture {
                                self.insetAmount = CGFloat.random(in: 10...90)
                                let demoColors = [UIColor.blue, UIColor.green, UIColor.red]
                                self.fillColor = demoColors.randomElement() ?? UIColor.white
                            }
            }.frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)
            
        }
    }
}

struct Trapezoid: Shape {
    var insetAmount: CGFloat
    var fillColor: UIColor

    func path(in rect: CGRect) -> Path {
        var path = Path()

        path.move(to: CGPoint(x: 0, y: rect.maxY))
        path.addLine(to: CGPoint(x: insetAmount, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.maxX - insetAmount, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
        path.addLine(to: CGPoint(x: 0, y: rect.maxY))
        path.closeSubpath()
        fillColor.setFill()
        UIColor.white.setStroke()
        path.fill()
        return path
   }
}

但是,路径是黑色的,并且 path.fill() 行显示警告:

调用“填充(样式:)”的结果未使用

有谁知道如何设置形状的颜色属性并在点击时更改它?

标签: swiftswiftui

解决方案


Afill应适用于Shape

这是可能的解决方案(使用 Xcode 12 测试)

struct PathView: View {
    @State private var insetAmount: CGFloat = 50
    @State private var fillColor: UIColor = UIColor.white
    var body: some View {
        GeometryReader {
            geometry in
            ZStack {
                Trapezoid(insetAmount: insetAmount)
                            .fill(Color(fillColor))           // << here !!
                            .frame(width: 200, height: 100)
                            .onTapGesture {
                                self.insetAmount = CGFloat.random(in: 10...90)
                                let demoColors = [UIColor.blue, UIColor.green, UIColor.red]
                                self.fillColor = demoColors.randomElement() ?? UIColor.white
                            }
            }.frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)

        }
    }
}

struct Trapezoid: Shape {
    var insetAmount: CGFloat

    func path(in rect: CGRect) -> Path {
        var path = Path()

        path.move(to: CGPoint(x: 0, y: rect.maxY))
        path.addLine(to: CGPoint(x: insetAmount, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.maxX - insetAmount, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
        path.addLine(to: CGPoint(x: 0, y: rect.maxY))
        path.closeSubpath()
        return path
   }
}

推荐阅读