Сохраняйте позицию ScrollView при нажатии на вкладку внутри (которые обновляют данные внутри) - PullRequest
0 голосов
/ 19 февраля 2019

scrollview - просмотр содержимого - 1) изображение, 2) вкладка, 3) просмотр стека

Выше приведена схема раскадровки. Вкладки фактически представляют собой коллекцию. Ниже вкладки находится представление стека (которое также находится внутри представления содержимого) .Когда я нажимаю на каждую из вкладок, я отправляю индекс выбранной вкладки на didSelect .Он вызовет функцию refreshData , имеющую этот поток: текущие подпредставления в представлении стека будут удалены (с использованием vc.mainStack.subviews.forEach ({$ 0.removeFromSuperview ()}) ) и перезагрузит другие подпредставления в соответствии с индексом выбранной вкладки.Положение изображения останется таким же , что вверху страницы.Однако каждый раз, когда я нажимаю на вкладку, экран всегда прокручивается вверх.Как сохранить положение прокрутки (перед тем, как щелкнуть другую вкладку), чтобы при нажатии на новую вкладку она оставалась в той же позиции прокрутки?

self.yContentOffset = scrollView.contentOffset.y

уже добавили указанный выше код в scrollViewDidScroll и

vc.scrollView.contentOffset.y = self.yContentOffset

добавить приведенный выше код после удаления всех подпредставлений в стеке, затем я вызываю новые данные (для подпредставлений).Также попытался добавить код после вызова новых подпредставлений, но оба не работают.Кто-нибудь знает логику, как это сделать?

1 Ответ

0 голосов
/ 20 февраля 2019

Похоже, проблема в том, что пользовательский интерфейс "обновляется" между точкой, где вы удаляете текущие подпредставления, и когда вы добавляете новые подпредставления.Таким образом, mainStack становится очень коротким, что приводит к тому, что представление содержимого недостаточно высокое, чтобы требовать прокрутки, и представление прокрутки настраивается соответствующим образом.

Вы можете либо подождать, но и удалить подпредставления, пока у вас не появится новыйподпредставлений и удалите / добавьте в том же самом функционале, или замените подпредставления ясным представлением «заполнителя».

Второй вариант может выглядеть следующим образом:

func replaceViewsWithPlaceholderView() -> Void {

    // get an array of the current views in the stack
    let viewsToRemove = mainStack.arrangedSubviews

    // create a clear view
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .clear

    // needs a width
    v.widthAnchor.constraint(equalToConstant: 1).isActive = true

    // constrain the height of the "place holder" view to the current height of the stack view
    v.heightAnchor.constraint(equalToConstant: mainStack.frame.height).isActive = true

    // add the "place holder" view to the stack
    mainStack.addArrangedSubview(v)

    // remove the views that were in the stack
    viewsToRemove.forEach {
        $0.removeFromSuperview()
    }

}

Тогда в вашем функционалеэто добавляет новые подпредставления, основанные на выбранной вкладке, сначала:

    // remove the "place holder" view
    mainStack.arrangedSubviews.forEach {
        $0.removeFromSuperview()
    }

с последующим (вероятно, цикл .forEach) добавлением новых подпредставлений в main.Stack.

Конечно, еслиВы прокрутили так, что ваши «вкладки» находятся в верхней части представления прокрутки, а «вкладка B» не имеет достаточного количества подпредставлений, чтобы требовать прокрутки, представление прокрутки снова настроится - но только до точки, где нижняя часть содержимоговид находится внизу прокрутки.

...