Как я могу получить текущий индекс (идентификатор) последней видимой строки в списке или LazyVStack после того, как пользователь прокручивает и ссылается на него после поворота?

У меня есть LazyVStack в моем пользовательском интерфейсе, и после поворота устройства отображаемые строки не такие, как до поворота. Даже близко к этим рядам.

До SwiftUI я справлялся с этим, получая последнюю видимую строку в viewWillTransition, а затем прокручивая ее после ориентацииDidChangeNotification.

Я не нашел способа в SwiftUI определить, когда устройство изменится, чтобы я мог получить индекс последней строки и прокрутить до него после поворота.

Есть ли эквивалент viewWillTransition или какая-либо стратегия, которую я могу использовать для получения этой функциональности?


person alionthego    schedule 12.04.2021    source источник


Ответы (1)


Чтобы получать уведомления об изменениях ротации в SwiftUI, вы можете:

struct ContentView: View {
    let rotationChangePublisher = NotificationCenter.default
        .publisher(for: UIDevice.orientationDidChangeNotification)
    
    var body: some View {
        Text("Some View !")
            .onReceive(rotationChangePublisher) { _ in
                print("View Did Rotate")
            }
    }
}

Чтобы иметь возможность прокручивать любую строку по своему желанию, вы должны прочитать это замечательное сообщение в блоге Маджида: https://swiftwithmajid.com/2020/09/24/mastering-scrollview-in-swiftui/
Это один из немногих способов делать то, что вы хотите в SwiftUI, и я бы сказал, что это лучший способ, хотя это немного взломано.

РЕДАКТИРОВАТЬ 1:

Чтобы иметь возможность прокручивать до последней строки перед поворотом, вам необходимо сохранить последние последние видимые строки в массиве или что-то подобное вместе с ориентацией. Затем всякий раз, когда устройство меняет ориентацию, вы можете выбрать последнее значение из массива, имеющего предыдущую ориентацию, и перейти к этой строке.

person Mahdi BM    schedule 12.04.2021
comment
спасибо, но, как я уже упоминал в вопросе, мне не нужно знать после поворота устройства. Мне нужно знать перед вращением. Таким образом, ссылка на viewWillTransition. Мне нужен индекс непосредственно перед переходом, поэтому после поворота я знаю, к какой строке прокручивать, потому что он уже будет выполнять случайную прокрутку во время поворота, пытаясь определить динамическую высоту строки. - person alionthego; 12.04.2021
comment
Хммм, я понимаю. Затем, насколько я могу судить, вам нужно сохранить последние последние видимые строки в массиве вместе с ориентацией. Затем всякий раз, когда устройство меняет ориентацию, вы можете выбрать последнее значение из массива, имеющего предыдущую ориентацию, и перейти к этой строке. - person Mahdi BM; 12.04.2021