Попробовав различные приемы и приемы - я просто не смог заставить контейнер UIKit (т.е. VibrantView
) надежно обнять содержимое SwiftUI, не добавив модификатор .frame(...)
фиксированного размера сверху - что затрудняет его использование с динамическим размером Text
.
То, что сработало для меня, было чем-то вроде хака и, вероятно, не сработает для каждого общего вида c (и, вероятно, не будет хорошо масштабироваться для десятков просмотров), но хорошо работает для простые варианты использования, особенно если вы размещаете это внутри динамически изменяемого размера UITableViewCell
.
. Идея состоит в том, чтобы использовать фиктивную версию того же представления и установить VibrantView
в .overlay( ... )
, Это заставит оверлей принять тот же общий размер родительского SwitfUI View
. Поскольку применяемое представление модификатор является копией того же представления, которое переносит VibrantView
, вы получите правильный динамический размер c во время выполнения и в предварительном просмотре Xcode.
Итак, что-то вроде этого:
SomeView()
.frame(minWidth: 0, maxWidth: .infinity)
.overlay(
VibrantView(vibrancyBlurEffectStyle: .dark) {
SomeView()
.frame(minWidth: 0, maxWidth: .infinity)
}
)
Я могу себе представить, что могу превратить это в модификатор, чтобы обернуть вышеупомянутое в один вызов, но в моем случае, чтобы убедиться, что он остается производительным для изображений, я делаю что-то вроде этого:
Circle()
.foregroundColor(.clear)
.frame(width: 33, height: 33)
.overlay(
VibrantView(vibrancyBlurEffectStyle: .systemMaterialDark) {
Image("some image")
.resizable()
}
)
Создание Circle
возможно более легкий вес по сравнению с реальным изображением. Я создаю прозрачный круг, устанавливаю фактический размер изображения и помещаю контейнер VibrantView
в overlay
.