如何在水龙头上更改形状颜色

时间:2020-08-01 09:51:58

标签: swift swiftui

我想实现在点击时更改形状颜色的逻辑。我尝试如下修改example for changing the shape on tap

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()行显示警告:

“ fill(style :)”调用的结果未使用

有人知道如何设置形状的颜色属性并在点击时进行更改吗?

1 个答案:

答案 0 :(得分:1)

fill应该应用于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
   }
}