SwiftUI View не обновляется - PullRequest
       0

SwiftUI View не обновляется

0 голосов
/ 04 февраля 2020

Содержимое CardView внутри ForEach из CardNavigatorView корректно обновляется благодаря асинхронной задаче загрузки c (внутри CardView), которая загружает изображение, и Image() отображается правильно, но я обнаружил, что рамка вокруг CardView в CardNavigatorView не обновляется, соответственно, в результате чего Text("test") появляется в середине изображения CardView, а не отталкивается рамкой CardView, если оно было обновлено правильно, чтобы окружить изображение. border(Color.red, width:2) помог мне сделать вывод так, как будто он пуст. Любое предложение, пожалуйста?

struct CardNavigatorView: View {
    @ObservedObject var model: CardNavigatorViewModel
    @State private var offset: CGFloat = 0
    let spacing: CGFloat = 10

    var body: some View {
        GeometryReader { geometry in
            return ScrollView(.horizontal, showsIndicators: true) {
                HStack(spacing: self.spacing) {
                    ForEach(self.model.cardSource.cards, id:\.hashString) { card in
                        CardView(card: card)
                            .frame(width: geometry.size.width).border(Color.red, width: 2)
                    }
                }
            }
            .content.offset(x: self.offset)
            .frame(width: geometry.size.width, alignment: .leading)
        }
        Text("Test")
    }
}

CardView объявлен следующим образом

struct CardView: View {
    @ObservedObject var card: Card
    @EnvironmentObject var userData: UserData

    var body: some View {
        GeometryReader { geometry in
            VStack {
                ZStack(alignment: .topTrailing) {
                    ImageViewContainer(imageUrl: self.card.imagesURL[0])
                        .frame(width:geometry.size.width)
                        .scaledToFill()
                        .clipped()
                    NameView(name: self.card.name)
                        .frame(width:geometry.size.width)
                    Button(action:{
                        self.userData.toggleFav(card:self.card)
                    }) {
                        ZStack{                        Image("fav_icon").renderingMode(Image.TemplateRenderingMode?.init(Image.TemplateRenderingMode.original))
                            .resizable()
                            .aspectRatio(contentMode:.fit)
                            .frame(width:25).opacity(self.card.isFav ? 1 : 0).offset(x:-10, y:10)
                            Image("not_fav_icon").renderingMode(Image.TemplateRenderingMode?.init(Image.TemplateRenderingMode.original))
                                .resizable()
                                .aspectRatio(contentMode:.fit)
                                .frame(width:25).opacity(self.card.isFav ? 0 : 1).offset(x:-10, y:10)
                        }
                    }
                }.border(Color.green, width: 3)

                Text("\(self.card.description)")
                Text("Note : \(self.card.ratingString)")

            }.onAppear{self.userData.setUserSettingsTo(card: self.card)}
        }
    }
}

1 Ответ

0 голосов
/ 08 февраля 2020

Решение найдено. Для людей, интересующихся, что не так: я думаю, что GeometryReader в CardView получает размер ScrollView родительского CardNavigatorView, который, в свою очередь, считается пустым. Поскольку GeometryReader замыкания позволяют расширяться за пределы его границ, я получил эффект, который пытался объяснить. Совет должен предоставить модификатор frame(width:geometry.size.width) для экземпляра CardView! (быть настроенным на ваши нужды)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...