Неправильное поведение анимации SwiftUI AsyncImage

При тестировании SwiftUI я обнаружил, что AsyncImage плохо работает при анимации перехода. Кажется, что он устанавливает свое окончательное положение перехода до того, как остальная часть пользовательского интерфейса переместится туда, из-за чего анимация будет казаться странной или отключенной.

Мой главный вопрос: есть ли способ получить доступ к SwiftUI-анимации AsyncImage и заставить ее работать с другими анимациями в другом месте приложения?

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

Представленное наложение описывается следующим образом:

          if isBottomSheetVisible {
                VStack(alignment: .leading) {
                    AccountSelectorHeader()
                    ForEach(accounts) { account in
                        AccountRow(
                            account: account,
                            isLast: accounts.last == account
                        )
                    }
                }
                .padding(.bottom, 24)
                .background(Color(.tableViewHeaderBackgroundColor)
                                .cornerRadius(24, corners: [.topLeft, .topRight])
                                .edgesIgnoringSafeArea(.bottom)
                )
                .transition(
                    .move(edge: .bottom)
                )
            }

И каждое изображение - это только стандартный AsyncImage внутри представления AccountRow:

          AsyncImage(url: URL(string: account.image)) {
            $0
                .resizable()
                .clipShape(Circle())
        } placeholder: {
            ProgressView()
        }

2 ответа

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

С помощью приведенного ниже кода я заставил изображение перемещаться вместе с листом, и при исчезновении оно не двигалось, но было удалено, поскольку лист скрывал его:

      AsyncImage(
            url: URL(string: url),
            transaction: Transaction(animation: .default)
        ) { phase in
            switch phase {
            case .success(let image):
                image
                    .resizable()
            default:
                Image("defaultImage")
                    .resizable()
            }
        }

Это действительно странно, только что попробовал с собственной реализацией asyncImage, и у нее похожее поведение, возможно, вам будет проще исправить это оттуда: Simple iOS13 AsyncImage. Я тоже посмотрю, если будет время.

Другие вопросы по тегам