Обновить непрозрачность представления на основе значения, рассчитанного в `.onChange`IOS

Программируем под IOS
Ответить
Гость
 Обновить непрозрачность представления на основе значения, рассчитанного в `.onChange`

Сообщение Гость »


Я создаю компонент галереи изображений карусели в SwiftUI, и мне нужно изменить непрозрачность элементов, которые не центрированы прямо сейчас. Моя галерея — это HStack с жестом перетаскивания. При перемещении свойство offset изменяется, и на основе смещения и положения представления относительно пространства координат экрана мне нужно установить непрозрачность. Я также использовал обходной путь: GeometryReader внутри .background, чтобы не испортить макет. Значение непрозрачности рассчитано правильно, и все в порядке, однако я изо всех сил пытаюсь понять, как передать это значение из .onChange в модификатор .opacity. Кроме того, непрозрачность должна обновляться на основе той же логики каждый раз, когда изменяется значение offset.


Изображение


Я пытался добавить свойство @State для каждого представления, чтобы сохранить это значение и получить к нему доступ позже, но это не сработало. Я не уверен, работает ли ForEach как обычный цикл. Я также исследовал переменные среды, но не смог найти ничего подходящего для моего случая.
HStack(интервал: 16) { ForEach(items) { элемент в @State var непрозрачность: CGFloat = 1 ImageCarouselCardView (элемент: элемент) .frame(ширина: Geometry.size.width - Constant.horizontalPadding * 2) .фон( GeometryReader {innerGeometry в SwiftUI.Color.clear .onChange(of: offset) { _ в // Расчет непрозрачности на основе расстояния карты от экрана пусть screenCoordinate = innerGeometry.frame(in: .named(Constant.screenCoordinateSpaceName)).minX let screenCoordinateIgnoringPadding = screenCoordinate - Constant.horizontalPadding пусть screenWidthWithoutPadding = Geometry.size.width - Constant.horizontalPadding * 2 пусть расстояние = мин (screenWidthWithoutPadding, abs (screenCoordinateIgnoringPadding)) opacity = 1.0 - ((distance / screenWidthWithoutPadding) * 0.6) // ЭТО ЗНАЧЕНИЕ НЕЗАКАЗНОСТИ } } ) .opacity(opacity) // ЭТО МНЕ НУЖНО ИСПОЛЬЗОВАТЬ ЗДЕСЬ } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»