ScrollView, содержащий свойство @State, вызывает сбой прокрутки — SwiftUI

#swift #swiftui

#swift #swiftui

Вопрос:

Этот простой ScrollView имеет очень прерывистую прокрутку при каждом обновлении @State свойства.

 import SwiftUI

struct ContentView: View {
    
    @State var currentTime: Double = 0
    let timer = Timer.publish(every: 0.5, on: .main, in: .common).autoconnect()
    
    var body: some View {
        ScrollView {
            Text("currentTime: (currentTime)")
        }
        .onReceive(timer) { input in
            currentTime = input.timeIntervalSince1970
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
 

Видео с глюками при прокрутке. ScrollView не работает.

Что я пробовал

  • Помещая .onReceive внутри ScrollView
  • Обновление @State currentTime с помощью других методов, помимо таймера. Все они так глючат.

Как я могу добиться ScrollView плавной прокрутки даже во @State время обновлений?

Ответ №1:

Я думаю, что это ошибка! Я был удивлен, насколько это возможно, потому что я постоянно обновляю свой ScrollView во время прокрутки! вам нужно добавить одну строку кода, чтобы решить проблему!


введите описание изображения здесь


 import SwiftUI

struct ContentView: View {
    
    @State var currentTime: Double = 0
    let timer = Timer.publish(every: 0.5, on: .main, in: .common).autoconnect()
    
    var body: some View {
        ScrollView {
            
            Color.clear.frame(height: 0)               // <<: Here!
            
            Text("currentTime: (currentTime)")
        }
        .onReceive(timer) { input in
            currentTime = input.timeIntervalSince1970
        }
    }
}
 

Комментарии:

1. Я попробовал это, и это сработало в данном конкретном случае, но мой фактический (более сложный) код все еще был поврежден. У ScrollView меня также был a LazyVStack с некоторыми дочерними элементами. Я переставил вещи, и это сработало. Мой совет: если вы видите эту проблему, попробуйте изменить порядок ваших вложенных представлений. В любом случае, я принял это, потому что это исправило исходный вопрос.

2. @joshuakcockrell: В качестве вашего совета вы сказали: «попробуйте изменить порядок», но в вашем первоначальном вопросе буквально вызывается только один контент Text("currentTime: (currentTime)") Как бы вы решили исходный вопрос своим советом? Итак, как я уже сказал, в ScrollView Xcode 12.4 (12D4e) действительно есть ошибка, я мог бы решить проблему с помощью совершенно ненужного color , и, как я также упоминал в своем ответе, я был удивлен этой проблемой, потому что со мной этого никогда не случалось, поэтому мой совет был бы code in moment! это означает, что любой код помогает и решает проблему с текущей версией.

3. Да, я определенно не могу исправить исходный вопрос, переставив вещи. Просто говорю, что если кто-то столкнется с этим в будущем, попробуйте свой ответ на добавление Color.clear , и если это не сработает, попробуйте изменить порядок вложенных представлений.