ScrollView приводит к 100% загрузке ЦП в SwiftUI - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать горизонтальный список изображений, и я написал код ниже в SwiftUI, но я не уверен, что здесь не так, но использование ЦП и ОЗУ достигло максимального уровня.

Я думал, что это из-за WebImage, но он не работает и для Rectangle, поэтому должно быть что-то связанное с кодом, который я написал.

private let reader = UIScreen.main.bounds

var body: some View {
    ScrollView(Axis.Set.horizontal, showsIndicators: false) {
            HStack(spacing: 0 ) {
                ForEach(self.images, id: \.self){ imageURL in
                    Rectangle()
                        .frame(width:self.reader.size.width, height: self.reader.size.height, alignment: .center)
                        .background(Color.green)
                        .border(Color.black,width: 10.0)
//                            WebImage(url: URL.init(string: imageURL))
//                                .resizable()
//                                .indicator(.activity) // Activity Indicator
//                                .scaledToFill()
//                                .frame(width:self.reader.size.width, height: self.reader.size.height, alignment: .center)
//                                .background(Color.red)
                }
            }
    }.onAppear {
        UIScrollView.appearance().isPagingEnabled = true
    } 
}

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Кажется, проблема в самом Xcode 11.5, так как этот код теперь работает нормально.

ScrollView(Axis.Set.horizontal, showsIndicators: false) {
                HStack(spacing: 0 ) {
                    ForEach(self.images, id: \.self){ imageURL in
                        WebImage(url: URL.init(string: imageURL))
                            .scaledToFit()
                            .frame(width: proxy.size.width, height: proxy.size.height, alignment: .center)
                            .clipped()
                            .background(Color.white)
                    }
                }
            }
0 голосов
/ 16 июня 2020

Предполагая, что вы пытаетесь заставить каждый прямоугольник / изображение заполнять экран и прокручивать по горизонтали, это должно сработать:

var body: some View {
    GeometryReader { proxy in
        ScrollView(Axis.Set.horizontal, showsIndicators: false) {
            HStack(spacing: 0 ) {
                ForEach(self.images, id: \.self){ imageURL in
                    Color.green
                        .frame(width: proxy.size.width, height: proxy.size.height, alignment: .center)
                        .border(Color.black,width: 10.0)
//                              WebImage(url: URL.init(string: imageURL))
//                                  .resizable()
//                                  .indicator(.activity) // Activity Indicator
//                                  .scaledToFill()
//                                  .frame(width:self.reader.size.width, height: self.reader.size.height, alignment: .center)
//                                  .background(Color.red)
                }
            }
        }.onAppear {
            UIScrollView.appearance().isPagingEnabled = true
        }
    }
}

Это не зависит от границ экрана, но использует GeometryReader для получить размер содержимого, в котором вид прокрутки находится внутри.

Также следует помнить, что все прямоугольники / изображения будут созданы сразу, нет кеширования представления прокрутки, поэтому, если у вас их много может снизить производительность.

...