SwiftUI фон по умолчанию для градиента - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь установить фон с изображением, и если нет изображения по умолчанию для градиента, дело в том, что я не нашел способ поместить 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 в его теле делают не соответствует ...

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Это связано с различными типами представлений, которые вы пытаетесь установить в фоновом режиме. Существует простой подход для решения этой проблемы:

.background((self.bgImage != nil) ? AnyView(self.bgImage!) : AnyView(self.bg))
1 голос
/ 07 февраля 2020

На самом деле вы не можете вернуть AnyView с вышеуказанными строками кода. Если вы хотите вернуть любой тип 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)))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...