SwiftUI背景默认为渐变
SwiftUI background default to gradient
我正在尝试使用图像设置背景,如果没有图像默认为渐变,问题是我还没有找到将 if 放入 SwiftUI 声明部分的方法,我不能使用函数,因为图像不符合视图。有没有人有条件地设置图像背景的解决方案,如果不可能将其设置为颜色?
struct ReminderView: View {
var reminder: Reminder
var bgImage: Image? {
if let data = reminder.image, let image = UIImage(data: data) {
return Image(uiImage: image).resizable()
}
return nil
}
var bg: LinearGradient {
return LinearGradient(gradient: Gradient(colors: [
Color(.sRGB, red: 38 / 255, green: 63 / 255, blue: 159 / 255, opacity: 1),
Color(.sRGB, red: 174 / 255, green: 77 / 255, blue: 1, opacity: 1)]),
startPoint: UnitPoint(x: 0, y: 1), endPoint: UnitPoint(x: 1, y: 0))
}
var body: some View {
GeometryReader { (geometry) in
VStack(alignment: .center, spacing: 0) {
Group {
Spacer()
Spacer()
}.shadow(color: .gray, radius: 5, x: 0, y: 0)
}.frame(width: geometry.size.width,
height: geometry.size.width / CGFloat(Card.aspectRatio))
.background((self.bgImage != nil) ? self.bgImage! : self.bg)
.cornerRadius(10)
.shadow(radius: 10)
}
}
}
问题是我也试过了,但没有用:
var bgImage: some View {
if let data = reminder.image, let image = UIImage(data: data) {
return Image(uiImage: image).resizable()
}
return LinearGradient(gradient: Gradient(colors: [
Color(.sRGB, red: 38 / 255, green: 63 / 255, blue: 159 / 255, opacity: 1),
Color(.sRGB, red: 174 / 255, green: 77 / 255, blue: 1, opacity: 1)]),
startPoint: UnitPoint(x: 0, y: 1), endPoint: UnitPoint(x: 1, y: 0))
}
它说:函数声明了一个不透明的 return 类型,但是其主体中的 return 语句没有匹配...
实际上你不能return AnyView 上面的代码行。如果你想 return 任何类型的 UIComponents,你可以这样做:
struct ContentView: View {
var body: some View {
VStack {
decicidedView(data: nil)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
func decicidedView(data:Data?) -> AnyView {
if data == nil {
return AnyView(Image("abc.png"))
} else {
return AnyView(Image("abc.png").background(LinearGradient(gradient: Gradient(colors: [.white, .black]), startPoint: .top, endPoint: .bottom)))
}
}
这是因为您尝试将不同类型的视图设置为背景。有一个简单的方法可以解决这个问题:
.background((self.bgImage != nil) ? AnyView(self.bgImage!) : AnyView(self.bg))
我正在尝试使用图像设置背景,如果没有图像默认为渐变,问题是我还没有找到将 if 放入 SwiftUI 声明部分的方法,我不能使用函数,因为图像不符合视图。有没有人有条件地设置图像背景的解决方案,如果不可能将其设置为颜色?
struct ReminderView: View {
var reminder: Reminder
var bgImage: Image? {
if let data = reminder.image, let image = UIImage(data: data) {
return Image(uiImage: image).resizable()
}
return nil
}
var bg: LinearGradient {
return LinearGradient(gradient: Gradient(colors: [
Color(.sRGB, red: 38 / 255, green: 63 / 255, blue: 159 / 255, opacity: 1),
Color(.sRGB, red: 174 / 255, green: 77 / 255, blue: 1, opacity: 1)]),
startPoint: UnitPoint(x: 0, y: 1), endPoint: UnitPoint(x: 1, y: 0))
}
var body: some View {
GeometryReader { (geometry) in
VStack(alignment: .center, spacing: 0) {
Group {
Spacer()
Spacer()
}.shadow(color: .gray, radius: 5, x: 0, y: 0)
}.frame(width: geometry.size.width,
height: geometry.size.width / CGFloat(Card.aspectRatio))
.background((self.bgImage != nil) ? self.bgImage! : self.bg)
.cornerRadius(10)
.shadow(radius: 10)
}
}
}
问题是我也试过了,但没有用:
var bgImage: some View {
if let data = reminder.image, let image = UIImage(data: data) {
return Image(uiImage: image).resizable()
}
return LinearGradient(gradient: Gradient(colors: [
Color(.sRGB, red: 38 / 255, green: 63 / 255, blue: 159 / 255, opacity: 1),
Color(.sRGB, red: 174 / 255, green: 77 / 255, blue: 1, opacity: 1)]),
startPoint: UnitPoint(x: 0, y: 1), endPoint: UnitPoint(x: 1, y: 0))
}
它说:函数声明了一个不透明的 return 类型,但是其主体中的 return 语句没有匹配...
实际上你不能return AnyView 上面的代码行。如果你想 return 任何类型的 UIComponents,你可以这样做:
struct ContentView: View {
var body: some View {
VStack {
decicidedView(data: nil)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
func decicidedView(data:Data?) -> AnyView {
if data == nil {
return AnyView(Image("abc.png"))
} else {
return AnyView(Image("abc.png").background(LinearGradient(gradient: Gradient(colors: [.white, .black]), startPoint: .top, endPoint: .bottom)))
}
}
这是因为您尝试将不同类型的视图设置为背景。有一个简单的方法可以解决这个问题:
.background((self.bgImage != nil) ? AnyView(self.bgImage!) : AnyView(self.bg))