в SwiftUI у нас есть новая функция, которая указывает, является ли представление идентификатором (находится в центре представления прокрутки) или нет, мое значение для каждого находится в HStack, который находится в ScrollView:
struct MyUnwindsView: View {
@State private var shouldScale = false
var body: some View {
ScrollView(.horizontal, showsIndicators: false) {
LazyHStack(spacing: 0) {
ForEach(0..<10, id: \.self) { unwindViewData in
Rectangle()
.padding(4)
.id(UUID())
.scrollTransition { content, phase in
content
.opacity(phase.isIdentity ? 1 : 0.6)
.scaleEffect(phase.isIdentity ? 1 : 0.9)
}
}
}
.padding(.horizontal)
.scrollTargetLayout()
}
.frame(maxWidth: .infinity)
.accessibilityElement(children: .contain)
.defaultScrollAnchor(.leading)
.scrollTargetBehavior(.viewAligned)
}
}
}
У меня также есть объявление в верхней части моей структуры:
@State private var shouldScale = false
Теперь в приведенном выше коде я хочу сделать следующее:
.scaleEffect(phase.isIdentity && shouldScale ? 1 : 0.9)
Но я получаю следующую ошибку:
Main actor-isolated property 'shouldScale' can not be referenced from a non-isolated autoclosure
Есть ли способ обойти эту проблему? В моем примере пользователь может перейти в контекст редактирования, в котором я бы установил для параметра mustScale значение false, и в этом случае я хочу, чтобы все карточки имели одинаковый размер. Но похоже, что я не могу получить доступ к этому свойству здесь.
Вы должны явно зафиксировать shouldScale
в списке захвата замыкания:
.scrollTransition { [shouldScale] content, phase in
content.scaleEffect(phase.isIdentity && shouldScale ? 1 : 0.9)
}
Таким образом вы не захватываете self
, а это не Sendable
. Вы просто фиксируете Bool
, то есть Sendable
.
Это отлично работает, большое вам спасибо! UUID() здесь не тот, мне просто пришлось из соображений конфиденциальности изменить фактический UUID в базе кода. @Подметальная машина