【问题标题】:How to use variables inside LinearGradient initializer - SwiftUI如何在 LinearGradient 初始化程序中使用变量 - SwiftUI
【发布时间】:2019-10-15 01:13:15
【问题描述】:

我试图在稍后在代码中使用 cardGradient 的结构中执行此操作。 "1a" 和 "1b" 是 assets 文件夹中的颜色。

var color1 = "1a"
var color2 = "1b"

let cardGradient = LinearGradient(gradient: Gradient(colors: 
[Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)

不能在属性初始化器中使用实例成员“color1”; 属性初始化程序在 'self' 可用之前运行。

不能在属性初始化器中使用实例成员“color2”; 属性初始化器在“self”可用之前运行

//

解决方案:感谢您的帮助!

var color1 = "1a"
var color2 = "1b"

VStack {
     // ... some views here
}
.background(LinearGradient(gradient: Gradient(colors: 
[Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing))

【问题讨论】:

  • 你可以让它成为一个惰性变量:lazy var cardGradient = ...
  • @Liv 欢迎来到 StackOverflow!如果下面的答案帮助您找到解决方案,您应该接受它。如果您认为您的解决方案足够独特,足以保证自己的答案,您可以用您的解决方案回答您自己的问题并接受它。这样,有类似问题的程序员就会知道什么对你有用。

标签: swiftui linear-gradients


【解决方案1】:

我不确定在手机上创建 LinearGradient 的强度有多大,但如果这不是问题,您可以将 LinearGradient 设为计算变量:

var color1 = "1a"
var color2 = "1b"

let cardGradient: LinearGradient {
    LinearGradient(gradient: Gradient(colors: [Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)
}

如果它占用大量计算资源,您可以将其设为可选(或给它一个默认值)并将其设置在视图的.onAppear 中,但随后您将不得不设置渐变@State

var color1 = "1a"
var color2 = "1b"
@State var cardGradient: LinearGradient?

var body: some View {
    VStack {
        // ... some views here
    }.onAppear {
        self.cardGradient = LinearGradient(gradient: Gradient(colors: [Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)
    }
}

请记住,如果颜色经常变化,这两种解决方案都不是特别好,但您不想在颜色变化时进行渐变更新,但这听起来对您来说不是问题.如果您发现第一个选项有延迟,请使用第二个。

【讨论】:

  • 我计划实现一个功能,允许用户更改某些视图的颜色背景。我希望他们能够从预设的渐变颜色中进行选择,并在任何给定时刻更改视图的颜色。 Xcode 不允许我在 LinearGradient 中使用变量,这样可以轻松更新渐变颜色
  • 你按我说的尝试了吗?发生 Xcode 错误是因为您不能在属性初始化程序中使用实例成员(颜色变量)(当您初始化渐变时)。我的两个解决方案通过计算渐变来解决这个问题,因此在访问它之前它不会使用颜色变量,或者通过在 onAppear 中设置它的值,它在颜色变量初始化后执行。
  • 我已经测试过了,我的两个解决方案都有效(除非你的评估不正确,但我无法测试)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多