swift - 如何在点击时更改形状颜色
问题描述
我想实现逻辑来改变点击时的形状颜色。我尝试修改示例以更改点击时的形状,如下所示:
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() 行显示警告:
调用“填充(样式:)”的结果未使用
有谁知道如何设置形状的颜色属性并在点击时更改它?
解决方案
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
}
}
推荐阅读
- python - 是否有在 python/KERAS 中创建自定义深度的 UNET 的功能?
- javascript - 如何将输入字段中的动态值传递给vue-circle组件的progress prop
- batch-file - 批处理循环不循环
- java - 从 wsdl 生成的类的参数顺序错误
- typescript - 具有任意最小长度 N 的 TypeScript 数组,可以很大
- r - 带有 Rshiny 模块应用程序的 updateTabsetPanel
- java - 在 Google 前端负载均衡器后面运行时如何正确从 Spring Boot 2.3 重定向到 HTTPS
- gitlab - 此 GitLab CI 配置无效:根配置包含未知键:标签
- assembly - 如何减小弦臂组件的尺寸
- javascript - TypeError:无法读取未定义 Node Js firebase 函数的属性“修剪”