我想实现在点击时更改形状颜色的逻辑。我尝试如下修改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 :)”调用的结果未使用
有人知道如何设置形状的颜色属性并在点击时进行更改吗?
答案 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
}
}