gpt4 book ai didi

SwiftUI : ViewModifier where content is a Shape

转载 作者:行者123 更新时间:2023-12-03 09:25:55 26 4
gpt4 key购买 nike

以下代码工作正常。所以真的,我很好......但我想了解 ViewModifiers......所以我的目标是将不变的东西与动态的东西分开来创建一个 .cardify() 自定义修饰符以调用形状 View 。

struct SetCard: View {

let pips: Int
let shape: SetCardShape
let color: Color
let shading: Double
let isSelected: Bool

var body: some View {

ZStack {
VStack {
ForEach( 0..<pips ) { _ in
ZStack {
getShape(self.shape).opacity(self.shading).foregroundColor(self.color)
getShape(self.shape).stroke().foregroundColor(self.color)
}
}
}
.padding() // for shape in RoundedRect
RoundedRectangle(cornerRadius: 10).stroke(lineWidth: isSelected ? 3.0 : 1.0).foregroundColor(.orange)
}
.scaleEffect(isSelected ? 0.60 : 1.0 )
.padding() // for spacing between cards
}
}
同样,出于学术/学习的原因,我想简化这个结构,并使用自定义修饰符将主要内容转换为标准卡片。
下面的代码块 仅适用 当我注释掉第二个 content Cardify 中的行ViewModifier 结构。所有使用填充形状作为点的卡片都可以很好地渲染。需要描边(即未填充)形状的卡片需要第二个 content在我的 Cardify ViewModifer 工作。
第二个内容行产生错误:
Cardify.Content(又名_ViewModifier_Content)类型的值没有成员foregroundColor
注释掉 .foregroundColor() 会产生错误:
Cardify.Content(又名_ViewModifier_Content)类型的值没有成员笔划
struct SetCardWithCardify: View {

let pips: Int
let shape: SetCardShape
let color: Color
let shading: Double
let isSelected: Bool

var body: some View {
ZStack {
getShape(shape)
.modifier(Cardify(pips: pips, shape: shape, color: color, shading: shading, isSelected: isSelected))
}
.scaleEffect(isSelected ? 0.60 : 1.0 )
.padding() // for spacing between cards
}
}


struct Cardify: ViewModifier {

var pips: Int
var shape: SetCardShape
var color: Color
var shading: Double
var isSelected: Bool

func body(content: Content) -> some View {

ZStack {
VStack {
ForEach( 0..<pips ) { _ in
ZStack {
content.opacity(self.shading).foregroundColor(self.color)
content.stroke().foregroundColor(self.color)
}
}
}
.padding() // for shape in RoundedRect
RoundedRectangle(cornerRadius: 10).stroke(lineWidth: isSelected ? 3.0 : 1.0).foregroundColor(.orange)
}
}
}
以防万一这很重要,以下代码是 getShape() 的来源这是 content的来源在 Cardify View 修改器。
func getShape(_ shape: SetCardShape ) -> some Shape {
switch shape {
case .circle:
return AnyShape( Circle() )
case .diamond:
return AnyShape( SetDiamond() )
case .squiggle:
return AnyShape( SetSquiggle() )
}
}


struct AnyShape: Shape {

func path(in rect: CGRect) -> Path {
return _path(rect)
}

init<S: Shape>(_ wrapped: S) {
_path = { rect in
let path = wrapped.path(in: rect)
return path
}
}
private let _path: (CGRect) -> Path
}
Diamond() 和 Squiggle() 是符合 Shape 协议(protocol)的结构,在这些结构中正确地从 `func path(in rect: CGRect) -> Path 返回一个路径。
我尝试使用以下内容向下转换第二个内容行: (content as! Shape).blah blah blah这会产生错误:
Protocol Shape 只能用作通用约束,因为它具有 Self 或关联的类型要求。
我也试过: (content as! Path)这不会产生任何编译时错误,但在执行时会失败并出现错误:
运行时遇到问题,请检查您的代码是否有围绕这一行的错误。 (表示第二个内容行)。
我该怎么做才能让编译器知道这是什么类型的内容,这样 stroke() 和 foregroundColor() 才能工作?

最佳答案

我不确定你可以,但你可以使用 Shape 上的扩展来近似它:

extension Shape {
func modified() -> some View {
self
.foregroundColor(Color.secondary.opacity(0.5))
}
}

// Usage example
struct ContentView: View {
var body: some View {
VStack {
Rectangle().modified()
Capsule().modified()
}
}
}
但是,与 View 修改器不同,您无法访问环境,因此它有些受限。

关于SwiftUI : ViewModifier where content is a Shape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62681769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com