SwiftUI 背景默认为渐变

Car*_*dal 1 iphone ios swift swiftui

我正在尝试用图像设置背景,如果没有图像默认为渐变,问题是我还没有找到一种方法将 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)
    }
}
}
Run Code Online (Sandbox Code Playgroud)

问题是我也尝试过这个但不起作用:

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))
}
Run Code Online (Sandbox Code Playgroud)

它说:函数声明了一个不透明的返回类型,但其主体中的返回语句没有匹配...

Asp*_*eri 5

这是由于您尝试将不同类型的视图设置为背景所致。有一个简单的方法可以解决这个问题:

.background((self.bgImage != nil) ? AnyView(self.bgImage!) : AnyView(self.bg))
Run Code Online (Sandbox Code Playgroud)